SQL索引问题:为什么SQL Server更喜欢这个NONCLUSTERED索引到CLUSTERED索引?

Tim*_*uri 3 sql-server indexing performance clustered-index

我有以下查询:

SELECT
    COUNT(*)
FROM
    FirstTable ft
        INNER JOIN SecondTable st ON ft.STID = st.STID
Run Code Online (Sandbox Code Playgroud)

你可以猜到,"STID"是"SecondTable"的主键......而"FirstTable"将有一个指向第二个表的指针.以下是我的索引:

FirstTable:"STID"列上的非集群索引

SecondTable:CLUSTERED PRIMARY KEY关于"STID"的指数

上面的查询给我一个19.90的子树成本,需要2秒.

在为该查询运行数据库调优顾问程序之后,他们建议使用与第二个表相同的索引...但是非聚集.所以我尝试了这些结果.

FirstTable:"STID"列上的非集群索引

SecondTable:NONCLUSTERED关于"STID"的指数

现在,上面的查询给我一个10.97的子树成本,并且需要<1秒!

这100%粉碎了我的大脑......为什么NONCLUSTERED索引在这种情况下的执行速度比CLUSTERED索引快?

Qua*_*noi 7

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

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

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

如果您发出如下查询:

SELECT  SUM(first_table_field + second_table_field)
FROM    FirstTable ft
INNER JOIN
        SecondTable st
ON      ft.STID = st.STID
Run Code Online (Sandbox Code Playgroud)

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