在我们的数据库中,我们有这个有 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
)
执行以下查询,执行计划向我们显示 index onUserTask_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似乎过滤值在列上重复的次数,它可以使未使用索引,但我尝试使用重复 60.000 次的 @IdEntitat 值和仅重复 175 次的其他值进行查询,结果相同,IDEntitat
列上的索引被忽略。
这让我抓狂!!!
谢谢你的帮助。