At 12.43 04/01/2008, Filippo Cerulo wrote:
Questa è davvero una tesi interessante......
Guarda che è decisamente normale...
Cioè tu sostieni che una query del tipo (tradotta in vulgaris):
"seleziona le Anagarfiche con CITTA='VERONA' dalla Tabella Anagrafiche"
abbia la stessa velocità di esecuzione di :
"seleziona le Anagrafiche con CITTA='VERONA' e
(TIPO=0 oppure TIPO=1) dalla Tabella Anagrafiche".
Prima di tutto dipende se i campi di filtro sono indicizzati o meno.
Mettiamo che in questo caso i campi siano
indicizzati in modo "favorevole" alla tua tesi.
Ovvero è indicizzato il campo CITTA e non il
campo TIPO. A questo punto bisogna valutare la
granularità dell'indice e la lunghezza del
record. Se su 100.000 record ho 10 record con
CITTA = 'VERONA' e TIPO in (0,1), forse la
seconda query ci metterà qualche millesimo di
secondo in più, perchè oltre a pescare i record
dall'indice, dovrà fare un ulteriore esame sui
risultati per verificare che i record restituiti
rispondano già all'altro criterio di filtro. Ma
nel caso ci siano 100 record con CITTA = 'VERONA'
di cui uno solo con TIPO in (0,1), la seconda
query sarà più veloce perché il tempo di lettura
e trasferimento dati di 100 record (al posto di
1) renderanno più pesante la prima. A meno che il
tuo scopo sia trovare solo il primo record di un
subset di record, ma raramente questo è quello
che si vuole, anche perché altrimenti per assurdo
la query più veloce di tutte è "SELECT * FROM TABELLA".
Nel caso in cui invece vi sia un indice con
entrambi i campi (CITTA e TIPO) non ci sono santi
che tengano: la seconda è ovviamente più veloce.
Poi possono esserci da fare sempre considerazioni
sulla granularità, ma di certo la prima non potrà
_mai_ essere più veloce della seconda.
Ovvio che su cento schede neppure mi pongo il problema. Ma su 100.000?
Ovviamente, più ci sono record e più le
differenze di tempo aumentano. E quanto ti ho
appena descritto si mostrerà in modo più netto.
Quanto sto dicendo, non lo affermo solo in base
alla logica di come funziona un db, ma anche in
base all'esperienza che ho maturato... e le
tabelle del sistema di cui dicevo che hanno
100.000 record non sono quelle grandi. Quelle
grandi hanno 50 milioni di record.
Poi, io uso Oracle che è un database abbastanza
serio, ma credo che anche Access sappia valutare
correttamente le query di cui sopra, usando gli
indici che ha, prima di fare scansioni su tutta la tabella.
E sulle query complesse come la mettiamo? Meglio
relazionare una Tabella Clienti, magari con un
indice univoco intero, oppure una select con un paio di parametri ed un OR?
Bah, credo che capirai anche tu che non ha molto
senso confrontare una query fatta sulla primary
key con una fatta su un set di campi non indicizzati...
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]