Newsgroup: it.comp.appl.access
Titolo: Query left join molto lenta! Come fare per ottimizzarla?

Ciao a tutti!
Ho un problema (anche se non so se è un problema) su di una query che,
almeno a colpo d'occhio, pare non sia proprio una scheggia!
Eccola qua:
SELECT Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento, Count(Anagrafica.Sezione) AS
ConteggioDiSezione
FROM Anagrafica LEFT JOIN Assegnazioni ON Anagrafica.Telefono =
Assegnazioni.Telefono
WHERE (((Assegnazioni.Telefono) Is Null))
GROUP BY Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento;
Le tabelle coinvolte sono due
Anagrafica:
Sezione (Indicizzato)
Telefono (PK)
Regione
Data_Caricamento (indicizzato)
e un'altra decina di campi contenenti dati statici
Assegnazioni:
Partner (PK)
Telefono (PK)
Data_Assegnazione (indicizzato)
Data_Download (indicizzato)
La relazione è 1-N tra le due tabelle
La tabella Anagrafica per ora contiene circa 300.000 record, con un
incremento di circa 1.000 record al giorno
La tabella Assegnazioni è in media l'80% dell'anagrafica.
L'esecuzione della query impiega circa 30 secondi su una workstation
media.
Secondi voi potrebbe migliorare?

DarknessBBB ha scritto:

Fai queste tre prove:
1)
SELECT Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento, Count(Anagrafica.Sezione) AS
ConteggioDiSezione
FROM Anagrafica
WHERE Anagrafica.Telefono NOT IN(SELECT Telefono FROM Assegnazioni)
GROUP BY Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento;
2)
SELECT Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento, Count(Anagrafica.Sezione) AS
ConteggioDiSezione
FROM Anagrafica
WHERE NOT EXISTS (SELECT Telefono FROM Assegnazioni WHERE 
Assegnazioni.Telefono=Anagrafica.Telefono)
GROUP BY Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento;
3)
SELECT Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento, Count(Anagrafica.Sezione) AS
ConteggioDiSezione
FROM Anagrafica
WHERE Anagrafica.Telefono <> ALL (SELECT DISTINCT Telefono FROM 
Assegnazioni)
GROUP BY Anagrafica.Sezione, Anagrafica.Regione,
Anagrafica.Data_Caricamento;
Ognuna di queste tre prove ed anche la tua query originale andrebbero 
provate sia nella situazione attuale, sia dopo avere definito un indice 
sulla tabella Assegnazioni sul solo campo Telefono.
Fai sapere l'esito delle prove, giusto per sapere se e quale delle 
soluzioni proposte ha funzionato meglio, anche a beneficio di tutti 
coloro che potrebbero avere problemi analoghi.
-- 
Vincenzo Turturro
Certificato Eucip Core Level
ITA 0000-002299 del 14/05/2007
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
risorse Access:
http://www.accessgroup.it
---------------------------------------------
Il sito comune di it.comp.as400
http://www.faq400.com
---------------------------------------------

 coloro che potrebbero avere problemi analoghi.
Spero che sia stato di aiuto! Ad ogni modo la soluzione più veloce (3
secondi) è quella originale col LEFT JOIN =)

 secondi) č quella originale col LEFT JOIN =)
Quindi, in conclusione, l'aggiunta dell'indice ha abbattuto il tempo di 
esecuzione del 90% ?


 esecuzione del 90% ?
Dove l'hai letto?? :D

DarknessBBB ha scritto:

Nel messaggio originale dicevi che la query impiegava 30 secondi, adesso 
dici che ne impiega 3 quindi ...


 dici che ne impiega 3 quindi ...
Ciao, scusa il ritardo nella risposta! Ad ogni modo sbagliai nella
risposta originale. Era di 3 secondi anche lì!
Ora ho più o meno lo stesso problema su un'altra query, solo che
questa volta la soluzione da me scelta, e anche altre, impallano
completamente il PC :(
SELECT Assegnazioni.Partner, Assegnazioni.[Data Scaricamento]
FROM Assegnazioni
WHERE Assegnazioni.Telefono IN (SELECT Assegnazioni.Telefono
   FROM Anagrafica INNER JOIN Assegnazioni ON Anagrafica.Telefono =
Assegnazioni.Telefono
   WHERE ((Anagrafica.Sezione="cosenza_b")
   AND (Assegnazioni.Partner="garibaldi")
   AND (Assegnazioni.[Data Assegnazione]=#2008-08-01#)))
GROUP BY Assegnazioni.Partner, Assegnazioni.[Data Scaricamento];
La sotto query restituisce 4000 record. La query principale
restituisce 10500 record, che raggruppati diventano 3.
Da notare che senza il group by tutto funziona correttamente, con il
raggruppamento rimane per un tempo indefinito a calcolare...
Ho provato anche ad usare DISTINCT invece del raggruppamento, ma è la
stessa cosa.
Cosa c'è di tanto brutto in questa query?
Riporto di nuovo la struttura delle tabelle
