SQL Server 2008: план выполнения зависит от параметров даты - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть SQL-запрос, план выполнения которого зависит от параметров DateTime, которые я предоставляю. Я понимаю, что если у меня есть условие, подобное:

WHERE Date > '2012-02-28' AND Date < '2012-01-01'

тогда план выполнения будет просто оценкой константы, поскольку результат не будет возвращен. Но в других случаях я получаю другие планы выполнения, которые не имеют никакого смысла для меня. Например с условием:

WHERE Date >= '2012-02-01 00:00:00' AND Date <= '2012-02-02 22:00:00'

запрос использует индекс, который я добавил, и он оптимизирован. Но если я изменю условие на:

WHERE Date >= '2012-02-27 00:00:00' AND Date <= '2012-02-27 22:00:00'

он больше не использует индекс.

Я перестроил все индексы в этой таблице перед выполнением запросов. Я не могу найти никакой логики в этом. Поэтому мой вопрос: как параметры DateTime могут повлиять на план выполнения, выбранный для запроса?

РЕДАКТИРОВАТЬ: Очевидно, причина была в том, что у меня был дополнительный индекс только для Date, который запутал SQL Server. После удаления этого индекса все заработало как положено. Но спасибо за идеи. Я не предложил достаточно подробностей для вас, чтобы понять это. Слишком много индексов никогда не бывает хорошим!

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

SQL Server хранит статистику содержимого таблицы и строит план запросов на основе этой статистики.

Например.Когда у меня есть таблица с 1 миллионом записей, где 900.000 записей находятся между 2012-02-27 и 2012-02-28, регулятор запросов будет выполнять сканирование таблицы для чтения данных.Если только 10% данных имеют даты между этими двумя значениями, они предпочтут использовать созданный вами индекс.

Одной из проблем со статистической моделью является проблема "устаревшей статистики".SQL Server будет выполнять «статистику автоматического обновления» всякий раз, когда было изменено более определенного процента таблицы или более 500 записей + (20% от количества элементов данных).( см. Эту статью ).

Так что, если ваша статистика устарела, SQL Server вполне может придумать неправильные планы запросов.

1 голос
/ 28 февраля 2012

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

http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/

В противном случае ваша таблица может быть разбита на разделы?

Если ни одна из этих справок, мне потребуется дополнительная информациявносить любые дальнейшие предложения.

...