В нашей базе данных у нас есть эта таблица с 200.000 строкПочему SQL Server не использует мой индекс?
CREATE TABLE dbo.UserTask (
UserTask_ID int NOT NULL IDENTITY (1, 1),
UserTask_SequenceNumber int NOT NULL DEFAULT 0,
UserTask_IdEntitat uniqueidentifier NOT NULL,
UserTask_Subject varchar(100) NOT NULL,
UserTask_Description varchar(500) NOT NULL,
.....
.....
CONSTRAINT [PK_UserTask] PRIMARY KEY CLUSTERED
(
[UserTask_ID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
Я создал индекс по UserTask_IdEntitat
колонке с
CREATE NONCLUSTERED INDEX IX_UserTask_IDEntitat ON dbo.UserTask
(
UserTask_IDEntitat
)
Выполнение следующего запроса, план выполнения показывает нам используется, что индекс UserTask_IDEntitat
чтобы сделать запрос:
SELECT UserTask_ID
FROM UserTask
WHERE UserTask_IdEntitat = @IdEntitat
ORDER BY UserTask_LastSendSystemDateTime desc
Но Если мы добавим еще одну колонку в Select
список, то индекс не используется
SELECT UserTask_ID, UserTask_SequenceNumber, UserTask_IDEntitat, ....., UserTask_Subject
FROM UserTask
WHERE UserTask_IdEntitat = @IdEntitat
ORDER BY UserTask_LastSendSystemDateTime desc
Почему добавление столбца отличается от первичного ключа делает, что план выполнения SQL-сервера не использует индекс на столбце UserTask_IDEntitat
?
По этой ссылке http://bytes.com/topic/sql-server/answers/144592-sqlsever-not-using-index кажется, что количество раз, когда отфильтрованное значение повторяется в столбце, может сделать, что индекс не используется, но я попытался выполнить запрос с повторяющимся значением @IdEntitat 60 000 раз и другие, которые повторяются только 175 раз, и результаты те же, индекс на столбце IDEntitat
игнорируется.
Это сходит с ума!
Благодарим за помощь.
Если вы на подходящей версии, и это общий запрос, вы можете посмотреть в 'ВКЛЮЧИТЬ 'ing' _SequenceNumber' в индексе. –
... и 'LastSendSystemDateTime' тоже, я думаю. (Чтобы помочь «заказать по»). –