В нашей базе данных у нас есть эта таблица с 200 000 строк
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 Server не используется индекс в столбце UserTask_IdEntitat
?
Следуя этой ссылке http://bytes.com/topic/sql-server/answers/144592-sqlsever-not-using-index, кажется, что количество раз, когда отфильтрованное значение повторяется в столбце, может сделать, что индекс не используется, но я попытался выполнить запрос с значением @IdEntitat, которое повторяется 60 000 раз, а другое повторяется только 175 раз, а результаты те же, индекс в столбце IDEntitat
игнорируется.
Это сходит с ума!!!
Спасибо за вашу помощь.