我有这个简单的查询。
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,但显示它仍在扫描整行。

为了完成这项工作,我需要做什么?如果你有什么想知道的关于我的情况,请尽管问。
尝试创建此索引:
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 索引设计指南
| 归档时间: |
|
| 查看次数: |
19547 次 |
| 最近记录: |