Sql server 优化select的执行

Sql server 优化select的执行,sql-server,indexing,query-optimization,clustered-index,non-clustered-index,Sql Server,Indexing,Query Optimization,Clustered Index,Non Clustered Index,我要优化此选项: Select Dane1, Dane5, Dane6, Dane7 FROM Test INNER JOIN Test2 ON Test.Id=Test2.IdTest WHERE Dane5 > 199850 我的数据库有两个表test,test2: 测试设计: Id int->主键, 丹麦1国际酒店, 丹麦国际, Dane3 int, Dane4 int, Dane5 int test2设计: Id int->主键, 丹麦6国际酒店, Dane7 int, IdTe

我要优化此选项:

Select Dane1, Dane5, Dane6, Dane7 FROM Test
INNER JOIN Test2 ON Test.Id=Test2.IdTest
WHERE Dane5 > 199850
我的数据库有两个表test,test2:

测试设计: Id int->主键, 丹麦1国际酒店, 丹麦国际, Dane3 int, Dane4 int, Dane5 int

test2设计: Id int->主键, 丹麦6国际酒店, Dane7 int, IdTest int

默认索引:PK_uuuu测试_uuu7C8480AE(群集)、PK_uuu测试2_uuuuuuu7E6CC920(群集)

问题是:
要附加或删除哪些索引?

定义索引总是一个好主意。这样可以保持数据的完整性,并且可以指定删除父记录时会发生什么情况(例如递归删除子记录)


外键也是快速查找子记录的好方法。

正如Tim指出的,外键和外键上定义的索引是一个好方法


一个额外的索引,它可以给你一些额外的速度——假设你的<>代码> 子句总是在<代码> DANE5 -是在DANE5

< P>上添加一个非聚集索引。在创建索引时,很少有事情要考虑,例如在这种情况下:

  • 有多少行Dane5>199850,总共有多少行
  • 索引->更新缓慢中的列是否有大量更新
  • 是否要对基表进行大量键查找,以获取查询中所需的其余列
您可以尝试以下方法:

Create index test_xxx on test (Dane5) include (Dane1)
是否包含Dane1取决于有多少行以及关键查找是否导致问题

Id已包含,因为它是聚集索引

Create index test2_yyy on test2 (IdTest) include (Dane6, Dane7)
是否将Dane6和Date7列作为包含列还取决于需要对表进行的键查找的总量


您应该打开statistics io以查看是什么导致了最具逻辑性的读取,以及是否需要在索引中包含列。

还可以告诉我们聚集索引中的列。默认情况下,它们将是您的主键,但可能您没有默认值?我们无法从自动生成的集群名称中推断出任何东西:PCClustered索引位于主键上:test table中的Id和test2 table中的Id。我已经定义了外键,并在Dane5上添加了一个非聚集索引,但估计的subtreecost比以前更糟,在:496352之前,在:49659之后为什么。。。“估计”是以度量的名义出现的——不必将其视为其他任何东西。索引可能相当棘手——它们可以帮助一些查询,同时伤害其他查询。我一直把它们看作是一门艺术而不是科学,尽管其中肯定涉及到科学。只需要测试和调整。也许那只是我:D