Newsgroup: it.comp.lang.delphi
Titolo: Join

Per l'esigenza di poter ordinare il dataset, in luogo di campi di lookup
sono state utilizzate delle joins. Si è notato un calo nelle prestazioni. Su
4.000 records il tempo di attesa è di circa 11 secondi! Il "tempo di attesa"
si riferisce al solo tempo utile per aprire il  dataset, senza che vi siano
controlli associati. Al contrario utilizzando i campi di lookup i risultato
si aggira sui 5 sec. Il pc utilizzato è  un Pentium III 500 Mhz con 128 Mb
di ram, e il motore di ricerca è il BDE su tabelle paradox.
Sono stati creati anche degli indici sui campi per gli joins ma il risultato
è rimasto invariato.
Questa è la stringa sql creata con SqlBuilder , e in allegato ci sono i
suddetti archivi, in grassetto i suddetti campi di join:
SELECT Chiamate.CodChiamata, Chiamate.DataChiamata, Chiamate.OraChiamata,
Chiamate.CodTipoChiamata, Chiamate.CodArgomento, Chiamate.Protocollo,
Chiamate.OpChiamata, Chiamate.Interlocutore, Chiamate.OpOttenuto,
Chiamate.Richiamare, Chiamate.Risolto, Chiamate.Oggetto,
Chiamate.CodCliente, Chiamate.Chiamante, Tabtiptel.DesTipTel,
Tabargomento.DesArgomento, Taboperatori.DesOperatore AS Operatore,
Chiamate.OpRichiesto, Taboperatori_1.DesOperatore AS Richiesto,
Taboperatori_2.DesOperatore AS Ottenuto, Tablinee.DesLinea,
Chiamate.CodLinea
FROM Chiamate
LEFT OUTER JOIN "TabTipTel.db" Tabtiptel
ON (Chiamate.CodTipoChiamata = Tabtiptel.CodTipTel)
LEFT OUTER JOIN "tabArgomento.db" Tabargomento
ON (Chiamate.CodArgomento = Tabargomento.CodArgomento)
LEFT OUTER JOIN "tabOperatori.db" Taboperatori
ON (Chiamate.OpChiamata = Taboperatori.CodOperatore)
LEFT OUTER JOIN "tabOperatori.db" Taboperatori_1
ON (Chiamate.OpRichiesto = Taboperatori_1.CodOperatore)
LEFT OUTER JOIN "tabOperatori.db" Taboperatori_2
ON (Chiamate.OpOttenuto = Taboperatori_2.CodOperatore)
INNER JOIN "TabLinee.db" Tablinee
ON (Chiamate.CodLinea = Tablinee.CodLinea)
Qualcuno sa darmi una dritta?
Grazie Marco

 [...]Qualcuno sa darmi una dritta?
allora, io non uso mai SQL builder, e non capisco perche' abbia messo un LEFT
OUTER JOIN, prova con una (piu' comune) INNER JOIN... non so se e' piu'
performante...
e poi quei .db, cosa sono? sono dei file? te lo chiedo perche' non so
come funziona Paradox, se e' cosi', non vorrei che ad ogni join si
dovesse aprire il DB, quindi sarebbe molto tempo sprecato..
poi cmq direi che la sintassi SQL e' abbastanza pesante 8), io direi di
provare con un motore SQL (se posso sbilanciarmi di consiglio InterBase,
tanto e freeware e lo puoi provare liberamente) poi magari penserei ad
una soluzione meno pesante se le cose non migliorano... cosa ti servono
tutte quelle join? vedendo le tabelle e le ralazioni forse si capirebbe
meglio come potrebbe essere "messo giu'" il db in modo da nn ricorrere
a tutte quelle join, o ancora, farne solo alcune, tipo se vuoi fare una ricerca
sull'"argomento" -> "pippo"
fai
select CodArgomento
from tabArgomento
where argomento='pippo'
(query istantanea, anche su paradox immagino)
e poi fai
select chiamate.x, chiamate.y,....
from chiamate
where CodArgomento=CodArgomntoRestituitoDallaQuerySopra
(query "umana", anche per paradox ;))
non penso che all'utente gli interessi vedersi davanti 4000 record,
gli fai vedere quelli a cui e' interessato, altavista, yahoo, vorgilio e
compagnia bella non credo ti facciano vedere tutti i miliardi di
indirizzi internet del mondo quando tu cerchi "pippo"....
spero di averti aiutato, cmq, concludendo passarei ad un motore SQL,
e se poi vuoi strafare, usi compinenti dedicati (IBX/IBO/FIB per IB o
altri)
Ciao,
Alan Solo

Ciao, ti do solo alcune dritte che forse, spero, possono esserti
utili:
Per prima cosa controlla che veramente tutti i campi che ti ritorna
l'SQL ti servano realmente, altrimenti ottieni molte informazioni
pressochè inutili.
In secondo luogo non capisco cosa intendi per ORDINARE.
Infatti la tua SQL non esegue alcun ordinamento sui dati.
Ricordati poi che il BDE non è un vero motore Sql e che quindi più la
query è "incasinata", più le performance degradano verso meno
infinito! Prova a togliere un po di outer join e sostituiscili con
join normali (credo che molti dei campi su cui fai l'outer join in
realtà siano obbligatori, giusto?)
Poi prova magari ad organizzare in modo diverso la tua applicazione
(per esempio, se stai facendo vedere tutti questi dati in una griglia
forse ti basterebbe vedere molti dei dettagli solo per il record
corrente, e quindi forse potresti caricarti alcuni dataset in memoria
e con dei campi calcolati mostrare le info aggiuntive.
Ciao,
Poi invece di fare
Rocco Barbaresco:
Herrare Humanum Est,
Perseverare Ovest ....
(By Fichi D'India)


Ti ringrazio per l'aiuto e se ti viene in mente qualcos'altro.
Ciao Marco

 Marco
unica tabella senza join 8)
Ciao,
Alan Solo

4.000 records il tempo di attesa č di circa 11 secondi!
e' un problema specifico di paradox, con un sql server sarebbe
istantanea.


La Left outer join prende tutte le righe dalla tabella sin. della
join, e prende tutte le righe della tabella dx. che sono uguali alla
condizione di recerca.
Questo tipo di ricerca è molto lento, sei sicuro della query ?
nel senso cerchi proprio TUTTI i record delle tabelle a sin della LEFT
OUTER JOIN ?
Se posti i tracciati e quello che vuoi ottenere forse ti posso
aiutare.
Massimo
----------------------------------------------------------
Il vero problema non è tanto sapere se le macchine pensano
bensì se gli uomini pensano. B.F. SKINNER (1904-90)
----------------------------------------------------------

 ha scritto nel messaggio
news:3a6578d0...@news.libero.it...
