为什么NOT IN执行INDEX SCAN而不是INDEX SEEK?
这是我目前在桌子上的索引,
CREATE NONCLUSTERED INDEX [idx_dmcasarms_CourseList_cDesc]
ON [dbo].[courselist]
(
[c_desc] ASC,
[c_code] ASC
)
Run Code Online (Sandbox Code Playgroud)
SQL语句,
SELECT c_code CourseCode
FROM courselist
WHERE c_desc = 'BACHELOR OF SCIENCE IN INFORMATION TECHNOLOGY'
GO
SELECT c_code CourseCode
FROM courselist
WHERE c_desc NOT IN ('PRE SCHOOL', 'BASIC EDUCATION', 'SCIENCE HIGH SCHOOL')
GO
Run Code Online (Sandbox Code Playgroud)
和执行计划,

无论如何我可以优化这个吗?
我有这个简单的查询。
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,但显示它仍在扫描整行。

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