繁体   English   中英

在已具有聚集索引的字段上放置非聚集索引时,性能会提高吗?

[英]Does performance improve when placing a nonclustered index on a field that already has a clustered index?

我昨天按照以下几行执行了一条update语句:

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

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

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

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

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

是否有人对为什么性能提升如此显着有任何想法?

我敢打赌,如果您查看执行计划:

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

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运行查询,和/或查看执行计划。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM