2012-02-28 2 views
2

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

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 влияют на какой план выполнения для запроса?

EDIT: По-видимому, причина в том, что у меня был дополнительный индекс в Дате, который только путал SQL Server. После удаления этого индекса все работало, как ожидалось. Но спасибо за идеи. Я не предлагал достаточно подробностей для вас, чтобы понять это. Слишком много индексов никогда не бывает хорошим!

ответ

1

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

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

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

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

1

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

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

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

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

+0

Спасибо за идеи (я даже не знал, что отфильтрованные индексы существуют). Индекс не фильтруется, и таблица не разбивается на разделы. Кажется, что план запроса зависит от статистики. –

Смежные вопросы