2013-04-29 12 views
6

L'ordine dei valori in una clausola WHERE IN è importante? (Questo è in Firebird SQL se questo è importante)L'ordine degli articoli in un SQL: WHERE IN() importa?

Come fa:

where field1 in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 

offerta un aumento delle prestazioni sopra

where field1 in (3, 5, 10, 2, 1, 8, 6, 9, 4, 7) 
+0

Ho rimosso il tag 'delphi', perché la tua domanda non ha assolutamente nulla a che fare con Delphi. Utilizza solo i tag effettivamente applicabili alla tua domanda; lo scopo dei tag è classificare le domande in categorie. Grazie. –

+0

La mia ipotesi sarebbe che, a meno che la lista IN non sia enorme, non fa alcuna differenza evidente sull'hardware moderno, perché alla fine della giornata deve esserci un ciclo for che itererà attraverso gli elementi di quell'elenco e li confronterà il valore del campo. –

+0

Grazie non era sicuro se il ciclo for ha causato un attraversamento di indice non necessario in un modo che contava o se comunque ha risolto l'elenco. Thx –

risposta

1

sì si, ma forse in maniera dipendente attuazione. L'IN viene elaborato come OR sequenziali e si può presumere che l'ordine di elaborazione più probabile sia quello scritto.

Detto questo, inizierei assumendo che l'ottimizzatore elaborerà gli elementi nell'ordine dato, perché è più semplice e li classifica nel set dal più o meno probabile. Non può ferire e molto probabilmente aiuterà. Se la differenza è misurabile o significativa è un'altra questione; misuralo e facci sapere

+0

non ero sicuro se avrebbe forzato l'indice a spostarsi avanti e indietro traversando aree già controllate (come un disco rigido frammentato) o se fosse stato ordinato prima da solo in ogni caso quindi non ho avuto bisogno di dedicare tempo anche all'ordinamento . Farò dei test per scoprirlo. –

+0

Sembra non avere differenze evidenti, o la differenza era troppo piccola per misurare nei test che ho fatto. –

+0

@ChrisValentine: non sorprende. Se il set diventasse grande, lo metterei in una tabella di ricerca, aggiungere un indice cluster, quindi inner-join ad esso. Credo che ci si possa sempre aspettare che gli ottimizzatori SQL eseguano un simile join in modo più efficiente di un OR. La funzione OR, dopo tutto, è semplicemente zucchero sintattico per un set troppo piccolo per disturbare la messa in un tavolo. –

Problemi correlati