SQL Server игнорирует индекс и выполняет сканирование таблицы

У нас есть небольшая проблема с одним из наших запросов, который выполняется внутри приложения.Net (4.5) через System.Data.SqlClient.SqlCommand,

Проблема в том, что запрос выполняет сканирование таблицы, которое выполняется очень медленно. Таким образом, план выполнения показывает Table-Scan здесь

Скриншот:

Детали:

Так что текст показывает, что фильтр к Termine.Datum и Termine.EndDatum вызвал Table-Scan. Но почему SQL-сервер игнорирует индексы? Существует два индекса для Termine.Datum и Termine.EndDatum. Мы также попытались добавить третий, объединив Datum и EndDatum.

Все индексы представляют собой некластеризованные индексы, и оба поля имеют DateTime.

2 ответа

Он выбирает сканирование таблицы на основе Расчетного количества строк 124844, где в качестве фактических строк указано только 831.

Оптимизатор считает, что для прохождения 124844 лучше будет выполнять сканирование в таблице, а не поиск индекса.

Также необходимо проверить другие столбцы, выбранные помимо индекса. Если вы выбрали другие столбцы помимо Индекса, который он должен выполнить Поиск RID после выполнения поиска по индексу, оптимизатор может подумать, что вместо поиска RID он предпочитает использовать Table Scan.

Первое исправление: обновите статистику и предоставьте оптимизатору достаточно информации, чтобы выбрать лучший план.

Можете ли вы предоставить полный запрос? Я вижу, что вы извлекаете данные за 3 месяца. Если этот диапазон составляет большой процент от набора данных, он может сканировать из-за того, что вы пытаетесь вернуть такой большой процент данных. Если индекс недостаточно избирателен, он не будет выбран.

Также...

У вас есть OR пункт в фильтре. Если посмотреть на предикат на скриншоте, который вы указали, то вы можете не заметить () вокруг двух разных фильтров. Это также может привести к сканированию.

Еще кое-что...OR пункты могут иногда приводить к плохим планам - альтернативой является разделение запроса на две части. UNIONED запрашивает каждый с разными OR в этом. Если вы предоставите запрос, я смогу дать вам переписанную версию, чтобы показать это.

Другие вопросы по тегам