3

我有以下查询:

SELECT
    COUNT(*)
FROM
    FirstTable ft
        INNER JOIN SecondTable st ON ft.STID = st.STID

你可以猜到,“STID”是“SecondTable”的主键......并且“FirstTable”将有一个指向第二个表的指针。以下是我拥有的索引:

FirstTable:“STID”列上的非聚集索引

SecondTable:CLUSTERED PRIMARY KEY“STID”上的索引

上面的查询给了我19.90的子树成本,需要 2 秒。

在为该查询运行数据库优化顾问后,他们建议创建与我在第二个表上的索引完全相同的索引......但非集群。所以我用这些结果进行了尝试。

FirstTable:“STID”列上的非聚集索引

SecondTable:NONCLUSTERED“STID”上的索引

现在,上面的查询给了我10.97 的子树成本,并且花费了 <1 秒

这 100% 让我脑洞大开……为什么在这种情况下,非集群索引的执行速度会比集群索引快?

4

1 回答 1

7

因为您的查询不会从表中检索任何实际记录,所以它只是计数。

对于非聚集索引,它只使用最有可能连接两个索引(其大小比表小)MERGE JOIN

使用聚集索引,它必须连接表和非聚集索引。表更大,遍历它需要更多时间。

如果您发出这样的查询:

SELECT  SUM(first_table_field + second_table_field)
FROM    FirstTable ft
INNER JOIN
        SecondTable st
ON      ft.STID = st.STID

它检索实际值,您将看到集群的好处。

于 2010-03-03T12:13:41.133 回答