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索引快?
因为您的查询不会从表中检索任何实际记录,所以它只是计数.
对于非聚集索引,它最有可能使用两个索引(大小比表小)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)
它会检索实际值,您将看到群集的好处.