2013-04-29 9 views
6

Czy kolejność wartości w klauzuli WHERE IN ma znaczenie? (To jest Firebird SQL, jeśli jest to istotne)Czy kolejność pozycji w SQL: WHERE IN() ma znaczenie?

Takie jak robi:

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

oferta wzrost wydajności w porównaniu

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

Usunąłem tag 'delphi', ponieważ twoje pytanie nie ma absolutnie nic wspólnego z Delphi. Używaj tylko znaczników, które faktycznie mają zastosowanie do Twojego pytania; celem tagów jest klasyfikowanie pytań na kategorie. Dzięki. –

+0

Domyślam się, że jeśli lista IN nie jest duża, nie ma zauważalnej różnicy w nowoczesnym sprzęcie, ponieważ na koniec musi istnieć pętla for, która będzie iterować elementy tej listy i porównywać je z wartość pola. –

+0

Dzięki nie było pewności, czy pętla for spowodowała niepotrzebne przechodzenie indeksów w sposób, który miał znaczenie, czy mimo to posortował listę. Thx –

Odpowiedz

1

Tak to będzie, ale być może w sposób zależny od implementacji. IN jest przetwarzane jako sekwencyjne OR i można założyć, że najbardziej prawdopodobny porządek przetwarzania jest taki, jak zapisano.

Powiedziałbym, że zacznę od założenia, że ​​optymalizator przetworzy elementy w podanej kolejności, ponieważ jest to najłatwiejsze i uszereguj je w zestawie od najbardziej do najmniej prawdopodobnego. To nie zaszkodzi i najprawdopodobniej pomoże. To, czy różnica jest mierzalna, czy znacząca, to inna kwestia; zmierzyć i powiadomić nas.

+0

Nie byłem pewien, czy zmusiłoby to indeks do poruszania się tam i z powrotem, przeszukując już sprawdzone obszary (jak pofragmentowany dysk twardy), czy też najpierw sortowało je samodzielnie, więc nie musiałem również tracić czasu na sortowanie . Przeprowadzę testy, aby się dowiedzieć. –

+0

Wydaje się, że nie ma zauważalnej różnicy, lub różnica była zbyt mała, aby zmierzyć w testach, które zrobiłem. –

+0

@ChrisValentine: Nic dziwnego. Jeśli zbiór byłby duży, umieściłbym go w tabeli odnośników, dodając indeks klastrowy, a następnie dołączając do niego wewnętrznie. Uważam, że optymalizatorzy SQL zawsze mogą oczekiwać takiego łączenia bardziej efektywnie niż OR. W końcu funkcja OR jest po prostu cukrem syntaktycznym, dla zestawu zbyt małego, aby zawracać sobie głowę stawianiem stołu. –

Powiązane problemy