Sql server 需要在不添加索引的情况下优化select查询

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

我有一个关于索引和执行计划的查询。下面是我正在使用的几个表格

表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上

下面是正在使用的查询

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子句