我有以下查询:
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索引快?
答案 0 :(得分:7)
因为您的查询没有从表中检索任何实际记录,所以它只是重要的。
使用非聚集索引,它只使用MERGE JOIN
加入两个索引(大小小于表)。
使用聚簇索引,它必须连接表和非聚集索引。表越大,遍历它就需要更多时间。
如果您发出如下查询:
SELECT SUM(first_table_field + second_table_field)
FROM FirstTable ft
INNER JOIN
SecondTable st
ON ft.STID = st.STID
检索实际值,您将看到群集的好处。