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

时间:2010-03-03 12:08:21

标签: sql-server indexing performance clustered-index

我有以下查询:

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

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

FirstTable:“STID”栏目上的NONCLUSTERED INDEX

SecondTable:CLUSTERED PRIMARY KEY关于“STID”的索引

上面的查询为我提供了 19.90的子树成本,需要2秒

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

FirstTable:“STID”栏目上的NONCLUSTERED INDEX

SecondTable:NONCLUSTERED关于“STID”的索引

现在,上面的查询为我提供了 10.97的子树成本,并且需要<1秒

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

1 个答案:

答案 0 :(得分:7)

因为您的查询没有从表中检索任何实际记录,所以它只是重要的。

使用非聚集索引,它只使用MERGE JOIN加入两个索引(大小小于表)。

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

如果您发出如下查询:

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

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