Sip*_*Cat 3 sql-server sql-server-2019
我有两个关于MS-SQL-Server 2019的索引管理的问题
如果在执行计划中出现了“表扫描”这个词,是否是“全表扫描”的指示,也就是说这里没有使用索引?
我不确定 MS-SQL 是否会使用我的索引。但我也不知道如何找出它实际使用的索引。
对于这个连接,我在 F_Skonto 表上创建了一个索引,其中包含 gueltig_ab、gueltig_bis 和 CD_Kunde 三个列。那是对的吗?
LEFT OUTER JOIN dbo.F_Skonto
ON S631_BSA.SPTAG >= dbo.F_Skonto.gueltig_ab
AND S631_BSA.SPTAG <= dbo.F_Skonto.gueltig_bis
AND S631_BSA.PKUNRG = dbo.F_Skonto.CD_Kunde
Run Code Online (Sandbox Code Playgroud)
对于这个连接,我在表 F_Umstellkosten 上创建了一个包含 Monat 和 CD_Kunde 两列的索引。那是对的吗?
LEFT OUTER JOIN F_Umstellkosten AS u1
ON CONVERT(varchar(6), v1.Tag, 112) = u1.Monat
AND v1.CD_Kunde = u1.CD_Kunde
Run Code Online (Sandbox Code Playgroud)
您不太可能在查询中看到索引的使用:
CONVERT(VARCHAR(6), v1.Tag, 112)
Run Code Online (Sandbox Code Playgroud)
因为它必须从 v1.Tag 计算值,所以它不能简单地使用统计中的直方图来确定行数。它必须扫描整个表以找到所有匹配的值,并且每次都必须进行转换。
如果 u1.Monat 和 v1.Tag 不是相同的数据类型,则可能需要添加相同数据类型的列(在 u1 或 v1 上,以哪个为准)。
但是,更大的问题是,您正在移动所有数据。该查询没有 WHERE 子句来过滤任何内容。如果没有过滤器,移动所有内容的最有效方法是通过扫描。索引搜索没有意义。您可能会在表之间的 JOIN 上看到一些索引使用(一旦您解决了 CONVERT 问题),但可能不会因为所有行都被移动。