小编Ros*_*ana的帖子

如何优化 NOT IN 语句

为什么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)

和执行计划,

在此处输入图片说明

无论如何我可以优化这个吗?

sql-server optimization index-tuning

7
推荐指数
2
解决办法
1721
查看次数

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

我有这个简单的查询。

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,但显示它仍在扫描整行。

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

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

sql-server t-sql

6
推荐指数
1
解决办法
2万
查看次数

标签 统计

sql-server ×2

index-tuning ×1

optimization ×1

t-sql ×1