2015-12-08 15 views
1

Этот запрос выполнить в 8 с .:индекс не найден в запросе

SELECT segment, 
    [segstart] 
FROM dbo.CmsCallHistory WITH (INDEX(CmsCallHistory_SGSTRT)) 
WHERE segstart between '2015-09-20' and '2015-09-30' 

Но этот запрос ~ 3 минуты подсчитывать

SELECT segment, 
    [segstart] 
FROM dbo.CmsCallHistory 
WHERE segstart between '2015-09-20' and '2015-09-30' 

строки данных ~ 120K

На втором плане выполнения запроса Я не вижу указателя, но только таблица сканирования стоит 98%: Second query

В первом плане выполнения запроса я вижу, что используется индекс segstart: First query

Колонны всего: ~ всего 20

Ряды: 40296998

Так что же случилось?

+1

Мы должны видеть больше информации, например, планов выполнения, таблиц и индексов определений и сведений о том, сколько строк существует в общей сложности и т.д., чтобы быть в состоянии помочь. –

+1

Любая таблица статистики ошибочна, сохраненный план запросов неверен или оптимизатор SQL делает неправильное решение. Запустите 'update statistics dbo.data с fullscan' и сразу же после этого ваш медленный запрос - что-то улучшилось? – Arvo

+1

может быть хорошим решением для вас - создать кластеризованный индекс? – Devart

ответ

1

Основываясь на втором плане выполнения, я бы предложил создать закрытый индекс. Это избавит KeyLookUpID от плана выполнения, и оно должно решить проблему. Также refer это для крытого индекса

CREATE NONCLUSTERED INDEX IX_Name 
ON dbo.CmsCallHistory (segstart) 
INCLUDE (segment.. include your other columns from select statement); 
GO 
1
DROP INDEX CmsCallHistory_SGSTRT ON dbo.CmsCallHistory 
GO 

CREATE CLUSTERED INDEX CmsCallHistory_SGSTRT ON dbo.CmsCallHistory (segstart) 
GO 

--DBCC FREEPROCCACHE 
--GO 

SELECT segment, [segstart] 
FROM dbo.CmsCallHistory 
WHERE segstart BETWEEN '2015-09-20' AND '2015-09-30' 
+0

У меня уже есть кластеризованный индекс (Id) – user3093010

+0

кластеризованный индекс + куча (проверьте свои изображения) в одной таблице? No way;) – Devart

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