非聚集索引仍在做索引扫描

Ros*_*ana 6 sql-server t-sql

我有这个简单的查询。

SELECT a.RecordID SubmissionID,
  a.[DateSubmitted],
  a.[FinalAction],
  a.[FinalActionReason],
  a.[FinalActionDate],
  b.GradeSubmissionListID,
  b.[Action],
  b.ActionReason,
  b.ActionDate
FROM [dbo].[GradeSubmissionList] a
  LEFT JOIN dbo.GradeSubmissionApproveRejectLog b
  ON a.RecordID = b.GradeSubmissionListID
WHERE a.EdpCode = '1314ACT1258'
ORDER BY a.DateSubmitted
Run Code Online (Sandbox Code Playgroud)

这会产生以下执行计划,

在此处输入图片说明

我想摆脱所有Clustered Index Scan。当我悬停第一个聚集索引扫描时,它生成了这个图像,

在此处输入图片说明

看起来它正在使用主键索引,

ALTER TABLE [dbo].[GradeSubmissionList] 
ADD CONSTRAINT [GradeSubmissionList_pk_RecordID] PRIMARY KEY CLUSTERED 
([RecordID] ASC) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

所以我根据这篇文章创建了一个:为什么在创建索引时使用 INCLUDE 子句?

CREATE NONCLUSTERED INDEX idx_dmcasarms_GradeSubmissionList_RecordIDEdpCode
ON [dbo].GradeSubmissionList(RecordID, FinalApprovedRejectedBy, EdpCode , DateSubmitted)
INCLUDE ( FinalAction, FinalActionDate, FinalActionReason );
Run Code Online (Sandbox Code Playgroud)

我期望 sql 语句现在将转换为Index Seek,但显示它仍在扫描整行。

在此处输入图片说明 在此处输入图片说明

为了完成这项工作,我需要做什么?如果你有什么想知道的关于我的情况,请尽管问。

Igo*_*nko 7

尝试创建此索引:

CREATE NONCLUSTERED INDEX idx_dmcasarms_GradeSubmissionList_RecordIDEdpCode
ON [dbo].GradeSubmissionList(EdpCode, DateSubmitted)
INCLUDE (FinalApprovedRejectedBy, FinalAction, FinalActionDate, FinalActionReason );
Run Code Online (Sandbox Code Playgroud)

仅当来自 WHERE 或 ON 子句的条件是索引列列表中的第一个时,才会使用索引查找。此外,这些字段必须是选择性的,这意味着条件必须从表中过滤掉一小部分或几行。

此外,您不需要将属于聚集索引的列包含到非聚集索引的列列表中,因为如果在表上定义了聚集索引,则非聚集索引始终包含聚集索引列。

实际上,这是一个非常复杂的课题。要了解有关在 Sql Server 中使用索引的更多信息,您可以阅读这篇文章SQL Server 索引设计指南