优化 select 的执行

Optimize the execution of select

我想优化这个select:

Select Dane1, Dane5, Dane6, Dane7 FROM Test
INNER JOIN Test2 ON Test.Id=Test2.IdTest
WHERE Dane5 > 199850

我的数据库有 2 个表 test,test2:

测试设计: Id int -> 主键, Dane1 诠释, Dane2 诠释, Dane3 诠释, Dane4 诠释, Dane5 整数,

test2 设计: Id int -> 主键, Dane6 诠释, Dane7 诠释, IdTest 整数,

默认索引: PK__test__7C8480AE(集群),PK__test2__7E6CC920(集群)

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

定义 foreign-key relationships 总是一个好主意。通过这种方式,您可以保持数据完整性,并且可以指定删除父记录时会发生什么(f.e。递归删除子记录)。

外键也是 index 快速查找子记录的好选择。

正如 Tim 指出的那样,外键和在外键上定义的索引是一个很好的调用。

一个额外的索引可以让你获得一些额外的速度 - 假设你的 where 子句总是在 Dane5 上 - 是在 Dane5

上添加一个非聚集索引

创建索引时需要考虑的事项很少,例如在这种情况下:

  • Dane5 > 199850 有多少行,总共有多少行?
  • 索引中的列是否有大量更新 -> 更新缓慢。
  • 是否要对基础 table 进行大量键查找以获得查询中所需的其余列?

您可以尝试这样的操作:

Create index test_xxx on test (Dane5) include (Dane1)

包含 Dane1 的天气取决于有多少行以及键查找是否导致问题

ID 已经包括在内,因为它是聚簇索引

Create index test2_yyy on test2 (IdTest) include (Dane6, Dane7)

将 Dane6 和 Date7 作为包含列的天气在这里还取决于需要对 table 进行的密钥查找总量以获取它们

您应该打开统计 io 以查看导致最多逻辑读取的原因,以及是否需要索引中包含的列。