Newsgroup: it.comp.lang.visual-basic
Titolo: [forse OT] Query sql in access e vb

Ciao a tutti, sto eseguendo questa query su un db access con le due tabelle
'auxcap' (3500 record) e 'comuni' (8457 record).
ho bisogno di selezionare tutti i cap di 'auxcap' che non siano presenti in
'comuni'
Quando provo ad eseguire la query, questa impiega tantissimo (pių di 5
minuti su un duron 750 e 256MB RAM) e mi restituisce un recordset vuoto,
sebbene io a mano abbia verificato che dovrebbero uscire delle righe. Ho
sbagliato la query o c'č qualche baco in access?
La query č questa:
select cap from auxcap where cap not  in (select cap from comuni)
Grazie a tutti
Bye!
Alex.

 select cap from auxcap where cap not  in (select cap from comuni)
Non so come mai non funzioni, ma è quanto di meno efficiente ci sia.
Prova:
Select t1.cap from
auxcap as t1
left outer join
comuni as t2
on t1.cap=t2.cap
where t2.cap is null
Ciao
Alberto
PS: controlla la sintassi del join e dell'is null, perchè non uso access e a
volte scrivo della cavolate immani nel suo Sql.

 select cap from auxcap where cap not  in (select cap from comuni)
La query è a posto, l'ho provata con due mie tabelle simili (897 Banche e
30441 Sportelli) basate sul codice ABI e il risultato è praticamente
immediato (sia in DAO che in ADO). Ho, su entrambe le tabelle, un indice
proprio su quel campo (per gli Sportelli reso univoco con l'aggiunta del
CAB)... prova ad aggiungerlo anche tu, anche se 5 minuti mi sembrano troppi
comunque.
Il fatto poi che non ti escano righe che invece dici di dover ottenere,
francamente fa pensare ad altro. Puoi postare la struttura (campi, nomi,
tipo e dimensioni) di entrambe le tabelle?

 Non so come mai non funzioni, ma è quanto di meno efficiente ci sia.
Può essere in generale, nel caso specifico e con i miei dati è molto più
veloce di quella che hai proposto (sia in DAO che in ADO, verso Access),
comunque perfettamente funzionante

 più veloce di quella che hai proposto
Buono a sapersi.
Allora ritiro il mio commento, e farò qualche prova.
Forse grazie ad una buona indicizzazione, ho sempre pensato che le subquery
fossero "il male".
Però forse l'ottimizzatore riesce a capire che la subquery, in questo caso
particolare, può essere eseguita una volta sola ed usata per ogni singolo
record, per cui...
Riflettendo sulla logica:
Per ogni record di Tab_1, verifica che non esista in Tab_2. Il che
significa, da un punto di vista logico, ripetere la ricerca in Tab_2 per
ogni singolo record di Tab_1. Evidentemente, invece, l'ottimizzatore di
Access è più furbo del previsto.
Ciao
Alberto

 Allora ritiro il mio commento, e farò qualche prova.
Nel frattempo (ho modificato il mio ESP0DAMA per ottenere i tempi) ho fatto
le prove con i dati prima indicati e con le due query che, come dicevo,
producono gli stessi corretti risultati:
Query con SubQuery:
DAO (praticamente identico a ADO) 0,0078s
Query con Join:
DAO (praticamente identico a ADO) 0,3431s

 DAO (praticamente identico a ADO) 0,3431s
Questo mi illumina non poco e nello stesso tempo mi spaventa
per gli adeguamenti che dovrò fare e provare... :-(
In ogni caso, grazie Albe.

 Access č piů furbo del previsto.
    Qui ne sono ben descritte le caratteristiche (notevoli) ed i limiti:
        Guida in linea di Microsoft Access (AC00):
            Ottimizzazione delle prestazioni delle query
--
Ciao :o)
Maurizio
--------
?SPQR(C)
 X
--------

> ADO (lato server e Static) 0,125s
Adesso mi torna...
Comunque l'ottimizzatore di Access è sempre stato uno dei migliori (dopo che
MS ha acquistato FoxPro, inchiodandone l'ottimizzatore in Access), e ritengo
sia la base di partenza per quello di Sql-Server.
Sicuramente la query col Join è migliore perchè può sfruttare al massimo gli
indici. Se non ci sono, anche quella con la subquery va bene.
Però, in Sql-Server, gli indici potrebbero esistere anche se tu non lo sai,
perchè è lo stesso server che può decidere di crearne e tenerli in cache, se
vede che servono per le query.
Ciao
Alberto