Порядок элементов оператора SQL Server «In» для повышения производительности - PullRequest
6 голосов
/ 01 февраля 2010

С учетом оператора SQL:

SELECT * 
FROM MY_TABLE
WHERE SomeNumberField in (0,99999)

Если я могу гарантировать, что для большинства строк в MY_TABLE значение SomeNumberField установлено на 99999, и могу проецировать, что это останется так до бесконечности, то лучше написать приведенный выше запрос следующим образом:

SELECT * 
FROM MY_TABLE
WHERE SomeNumberField in (99999,0)

Ответы [ 2 ]

4 голосов
/ 01 февраля 2010

Если у вас есть индекс на SomeNumberField, то этот оператор будет либо просто разделен на два сканирования диапазона по индексу, либо обработан как TABLE SCAN / CLUSTERED INDEX SCAN с фильтром.

Последнее более вероятно, при условии, что большинство ваших строк имеют SomeNumberField = 999999

Сканирование диапазона всегда будет выполняться в порядке индекса, независимо от порядка констант в предикате IN.

Время сравнения фильтра ничтожно мало по сравнению со временем, необходимым для извлечения страниц данных.

1 голос
/ 01 февраля 2010

Этот вид оптимизации может выполняться автоматически оптимизатором SQL при условии, что вы соберете некоторую статистику, которая используется оптимизатором. Для этой задачи вы можете использовать инструменты, предоставляемые поставщиком базы данных. Для сервера SQL обратитесь к следующей статье на MSDN: http://msdn.microsoft.com/en-us/library/cc966419.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...