Как влияет CONVERT () на INDEX при поиске? - PullRequest
10 голосов
/ 14 ноября 2011

Я использую SQL Server 2008. У меня есть неуникальный некластеризованный индекс для столбца DateTime «DateFrom». Я ищу таблицу на основе этого столбца. Я просто хотел узнать влияние функции CONVERT () на INDEX, см. Ниже:

Query1:
SELECT  *
FROM    myTable
WHERE   CONVERT(VARCHAR(10),DateFrom,23) >= '2011-01-01'

Query2:
SELECT  *
FROM    myTable
WHERE   DateFrom >= '2011-01-01 00:00:00.000'

Я проверил и не нашел никакой разницы. Но я думал, что, поскольку столбец конвертирован, поэтому SQL Server не может использовать индекс, верно?

Пожалуйста, прости меня, если это не правильный вопрос.

1 Ответ

13 голосов
/ 14 ноября 2011

Как правило, если в предложении WHERE имеется функция слева от сравнения, сервер не сможет использовать индекс для указанного столбца.

В вашем первом примере нет сравнения с колонкой DateFrom напрямую. Вместо этого вы используете функцию для столбца. Когда сервер расширяет это, он должен выполнять функцию для каждого значения столбца, и результирующее значение не индексируется. Поэтому для улучшения запроса нельзя использовать индекс.

Кроме того, в первом примере вы указали, что столбец DateFrom является столбцом datetime. Тем не менее, вы конвертируете столбец в строку и проводите сравнение строк. Следовательно, сервер не будет использовать ваш указатель даты и времени.

Во втором примере вы сравниваете постоянное значение со столбцом даты напрямую, поэтому сервер может использовать индекс. Сервер преобразует строковую константу в правой части сравнения в значение datetime. Однако он не будет использовать индекс во всех случаях. Например, если у вас очень мало строк, сервер может решить не использовать индекс и просто просканировать несколько строк.

Оба запроса могут давать один и тот же набор результатов, но они по-прежнему сильно отличаются.

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