0

我昨天按照以下几行执行了更新语句:

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

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

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

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

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

有没有人知道为什么性能增益会如此显着?

4

1 回答 1

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

于 2012-05-11T13:59:11.653 回答