在已经具有聚簇索引的字段上放置非聚簇索引时,性能是否会提高?

时间:2012-05-11 13:43:41

标签: sql indexing sql-server-2008-r2 clustered-index non-clustered-index

昨天我按照以下几行执行了更新声明:

UPDATE MainTable
Set SomeField = SubsetTable.SomeField
where MainTable.MainTableKey = SubsetTable.MainTableKey

其中SubsetTableMainTable的子集,并且具有相同的主键字段。 MainTable有大约200万条记录,SubsetTable有500万条记录。 MainTableKey是GUID。

这两个表都在MainTableKey上有聚集索引。

当我第一次执行此查询时,第一次花费了14个小时。

然后我在两个表上向MainTableKey添加了非聚集索引。现在需要30分钟。

有没有人对为什么性能增益如此戏剧性有任何想法?

1 个答案:

答案 0 :(得分:1)

我打赌你看看执行计划:

第一个查询是合并连接,它涉及完全读取两个表。

200M rows + 5M rows = 205M rows.
205M rows / 14 hours = 4067 rows per second.

第二个查询是一个嵌套循环连接,它读取整个小表并搜索每个小表行的大表。

5M + 5M rows = 10M rows.
10M rows / 40 minutes = 4166rows per second.

这些速率大致相等,支持我关于哪些行被读取的理论。

您不必猜测:使用SET STATISTICS IO ON运行查询,和/或查看执行计划。