昨天我按照以下几行执行了更新声明:
UPDATE MainTable
Set SomeField = SubsetTable.SomeField
where MainTable.MainTableKey = SubsetTable.MainTableKey
其中SubsetTable
是MainTable
的子集,并且具有相同的主键字段。 MainTable
有大约200万条记录,SubsetTable
有500万条记录。 MainTableKey
是GUID。
这两个表都在MainTableKey
上有聚集索引。
当我第一次执行此查询时,第一次花费了14个小时。
然后我在两个表上向MainTableKey
添加了非聚集索引。现在需要30分钟。
有没有人对为什么性能增益如此戏剧性有任何想法?
答案 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
运行查询,和/或查看执行计划。