Sql server 需要在不添加索引的情况下优化select查询
我有一个关于索引和执行计划的查询。下面是我正在使用的几个表格 表1:TestReviewResult 列|名称|类型|长度 TestReviewResultId | int | 4 测试编号| int | 4 审阅者用户ID | int | 4 当前指数 索引\名称索引\描述索引\关键字 TestReviewResult_PK群集的、唯一的主键位于主TestReviewResult ID上 表2:TestReviewFinding 列名称类型长度 TestReviewFindingId int 4 TestReviewResultId int 4 屏幕代码varchar 100 评审意见varchar 8000 CurrentIndex 索引\名称索引\描述索引\关键字 TestReviewFinding\u PK群集的、唯一的主键位于主TestReviewFindingId上 表3:TestReviewResultComment 列名称类型长度 TestReviewResultCommentId Int 4 TestReviewResultId Int 4 TestReviewComment varchar 8000 CurrentIndex 索引\名称索引\描述索引\关键字 TestReviewResultComment\位于主TestReviewResultId上的CI群集 TestReviewResultComment\ PK位于主TestReviewResultCommentId上的非聚集、唯一主键 表4:TestReviewFindingElement 列名称类型长度 TestReviewFindinglementId Int 4 TestReviewFindingId Int 4 元素代码varchar 25 CurrentIndex 索引\名称索引\描述索引\关键字 TestReviewFindinglementType_PK群集的、唯一的主键位于主TestReviewFindinglementId上 下面是正在使用的查询Sql server 需要在不添加索引的情况下优化select查询,sql-server,database,performance,join,performance-testing,Sql Server,Database,Performance,Join,Performance Testing,我有一个关于索引和执行计划的查询。下面是我正在使用的几个表格 表1:TestReviewResult 列|名称|类型|长度 TestReviewResultId | int | 4 测试编号| int | 4 审阅者用户ID | int | 4 当前指数 索引\名称索引\描述索引\关键字 TestReviewResult_PK群集的、唯一的主键位于主TestReviewResult ID上 表2:TestReviewFinding 列名称类型长度 TestReviewFindingId int
Select columnnames…. from
From TestReviewResult(NOLOCK) cr
left outer join TestReviewResultComment(NOLOCK) crc
on cr.TestReviewResultId = crc.TestReviewResultId
left outer join TestReviewFinding(NOLOCK) cf
on cf.TestReviewResultId = cr.TestReviewResultId
left outer join TestReviewFindingElement(NOLOCK) crf
on cf.TestReviewFindingId = crf.TestReviewFindingId
where cr.TestReviewResultId = @TestReviewNumber -- Test Review number is
being passed in the stored procedure
当我运行执行计划时,它建议添加下面提到的两个索引
CREATE NONCLUSTERED INDEX IX_TestReviewResultId
ON [TestReviewFinding] (TestReviewResultId)
CREATE NONCLUSTERED INDEX IX_TestReviewFindingId
ON [TestReviewFindingElement] (TestReviewFindingId)
有没有其他方法可以在不添加索引的情况下优化上述查询,因为执行了很多写操作
下面是可以在SQLServer中执行的ddl,并检查查询执行计划
Create table TestReviewResult(
TestReviewResultId int NOT NULL PRIMARY KEY ,
TestNumber int ,
ReviewerUserId int )
insert into TestReviewResult values(1,1,1)
insert into TestReviewResult values(2,2,2)
insert into TestReviewResult values(3,3,3)
Create table TestReviewFinding(
TestReviewFindingId int not null primary key,
TestReviewResultId int ,
ScreenCode varchar(100))
insert into TestReviewFinding values(1,1,'A')
insert into TestReviewFinding values(2,2,'B')
insert into TestReviewFinding values(3,3,'C')
Create table TestReviewResultComment(
TestReviewResultCommentId int not null primary key nonclustered,
TestReviewResultId int ,
TestReviewComment varchar( 8000)
)
CREATE CLUSTERED INDEX [CI_TestReviewResultId]
ON TestReviewResultComment (TestReviewResultId);
insert into TestReviewResultComment values(1,1,'A')
insert into TestReviewResultComment values(2,2,'B')
insert into TestReviewResultComment values(3,3,'C')
Create table TestReviewFindingElement(
TestReviewFindingElementId int not null primary key,
TestReviewFindingId int ,
ElementCode varchar(25))
insert into TestReviewFindingElement values(1,1,'A')
insert into TestReviewFindingElement values(2,3,'B')
insert into TestReviewFindingElement values(3,3,'C')
当我运行下面的查询时,我得到了两个表的索引扫描
TestReviewFindingElement和TestReviewFinding
Select *
From TestReviewResult(NOLOCK) cr
left outer join TestReviewResultComment(NOLOCK) crc
on cr.TestReviewResultId = crc.TestReviewResultId
left outer join TestReviewFinding(NOLOCK) cf
on cf.TestReviewResultId = cr.TestReviewResultId
left outer join TestReviewFindingElement(NOLOCK) crf
on cf.TestReviewFindingId = crf.TestReviewFindingId
where cr.TestReviewResultId = @TestReviewNumber -- Test Review number is
being passed in the stored procedure.You can use --> 1
是否有任何方法可以修改select查询以避免在不添加索引的情况下进行扫描您是否可以将表的架构添加为ddl并提供测试数据。您可以使用统计信息编写架构脚本,因此,我们可以重新设置问题我已经添加了ddl和insert脚本…请检查并让我知道我们是否可以根据提供的SQL让执行计划返回seek而不是SCANSB,它不会对任何列进行过滤(这意味着不存在特定于列值的具有等于条件的where子句)。因此,您要求通过这些连接扫描整个索引/表。在这种特殊情况下,扫描表比索引扫描快,然后从表中检索行。添加where子句可以将表的架构添加为ddl并提供测试数据。可以使用统计信息编写架构脚本,因此,我们可以重新设置问题我已经添加了ddl和insert脚本…请检查并让我知道我们是否可以根据提供的SQL让执行计划返回seek而不是SCANSB,它不会对任何列进行过滤(这意味着不存在特定于列值的具有等于条件的where子句)。因此,您要求通过这些连接扫描整个索引/表。在这种特殊情况下,扫描表比索引扫描快,然后从表中检索行。添加了where子句