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]

Rispondere a