Filippo Cerulo ha scritto:
Marco Quarona ha scritto:
At 09.32 04/01/2008, you wrote:
In altre parole, l'aggiunta di criteri di selezione è un motivo di criticità del DB?

No, a meno che il motore del db (o la il db stesso) siano stati progettati male. I filtri velocizzano le query, non le rallentano.
Questa è davvero una tesi interessante......
in un dbms semplice e leggero probabilmente no, ma in DBMS ideale sì (oracle ci prova).

Non importa la forma in cui scrivi una SELECT, questa viene comunque riprocessata e ottimizzata prima di essere data in pasto al motore del DBMS vero e proprio. Nella realtà, ci sarà senza dubbio qualche minima differenza, ma minima. Insomma, comandi equivalenti, per quanto diversi, se il preprocessore funzionasse alla perfezione dovrebbero essere tradotti allo stesso modo.


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".

Ovvio che su cento schede neppure mi pongo il problema. Ma su 100.000?
queste non sono due select equivalenti (che danno quindi il medesimo output) e quindi non necessariamente hanno la stessa velocità di esec.

Cmq in questo caso, anche su 1'000'000 di record, non ti accorgi della differenza.
Suppongo che su CITTA sia stato creato un indice (mentre su TIPO no).
Facciamo finta che ci siano 1'000 schede di 'VERONA' (0,1%): la select richiede solo di scorrere un elenco di mille schede e dare il risultato. Nel secondo caso le schede che vengono lette sono ugualmente 1000, solo che alcune non vengono stampate (quelle di TIPO>=2).

SI', ci mettono lo stesso tempo.


caso particolare:
se si tratta di un'azienda di VERONA e il 99% delle schede contiene quella parola, non abbiamo alcun vantaggio nell'uso di quell'indice. Magari esistono 10 valori equamente distribuiti per il campo TIPO e allora è stato creato un indice su tale campo. In tal caso la seconda select potrebbe essere circa 5 volte piu' veloce, dovendo scartabellare solo tra 200'000 schede (in media).


se non esistono indici, allora ci mettono lo stesso tempo (vanno analizzate tutte le schede).



INFINE

"seleziona le Anagrafiche con CITTA='VERONA' e (TIPO=0 oppure TIPO=1) dalla Tabella Anagrafiche".
e
"seleziona le Anagrafiche con (TIPO=0 oppure TIPO=1) e CITTA='VERONA' dalla Tabella Anagrafiche".

su un DBMS che non perde tempo ad analizzare prima il comando, queste select potrebbero avere tempi di esecuzione molto diversi,
ma su un DBMS con preprocessore queste sono equivalenti.

in SQL io dico COSA voglio ottenere, non COME voglio che il computer lo ottenga, fidandomi di come l'interprete del linguaggio è stato implementato. Con i linguaggi procedurali io indico COME e quindi le prestazioni variano enormemente in base a cio' che scrivo.


e poi, le prestazioni non sono tutto.
la "manutenibilità" e la possibilità di adattare il lavoro alle nuove esigenze, le vedo molto piu' importanti

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?
non ho capito la domanda.


ciao,
Giacomo



--
Email.it, the professional e-mail, gratis per te: http://www.email.it/f

Sponsor:
Un prestito supertasso zero spese? Oggi con Finatel è realtà. Puoi ottenere 
fino a 50.000 € anche in 24 ore. Scopri Come
* Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=7370&d=4-1

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Rispondere a