Учитывая SQL-оператор:
SELECT *
FROM MY_TABLE
WHERE SomeNumberField in (0,99999)
Если я могу гарантировать что большинство строк в MY_TABLE
иметь SomeNumberField
набор к 99 999, и может предположить, что это останется случаем неограниченно долго, это лучше для записи вышеупомянутого запроса как это:
SELECT *
FROM MY_TABLE
WHERE SomeNumberField in (99999,0)
Если у вас есть индекс на SomeNumberField
, то это утверждение будет либо просто разбито на два диапазона сканирования индекса, либо обработано как TABLE SCAN / CLUSTERED INDEX SCAN
с фильтром.
Последнее более вероятно, при условии, что большинство строк имеют SomeNumberField = 999999
Сканирование диапазона всегда будет выполняться в порядке индекса, независимо от порядка констант в предикате IN
.
Время сравнения фильтра пренебрежимо мало по сравнению со временем, необходимым для получения страниц данных.
Такой вид оптимизации можно сделать автоматически на оптимизатором SQL при условии, что вы собираете некоторые статистические данные, которые используются оптимизатором. Вы можете использовать инструменты, предоставляемые поставщиком баз данных для этой задачи. Для SQL Server обратитесь к следующей статье на MSDN: http://msdn.microsoft.com/en-us/library/cc966419.aspx