在我們的數據庫中,我們有這樣的表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 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之後,它似乎是過濾值在列上重複的次數,它可以使索引不被使用,但我嘗試使用重複的@IeEntitat值執行查詢60.000次等僅重複175次,結果相同,IDEntitat
列的索引被忽略。
這讓我瘋狂!
感謝您的幫助。
如果你是在一個合適的版本,這是一個常見的查詢,你可能想看看'INCLUDE索引中的'_SequenceNumber'。 –
......還有'LastSendSystemDateTime',我想。 (爲了幫助'按'排序)。 –