【问题标题】:Does performance improve when placing a nonclustered index on a field that already has a clustered index?将非聚集索引放在已具有聚集索引的字段上时性能会提高吗?
【发布时间】:2012-05-20 02:55:40
【问题描述】:

我昨天执行了一条更新语句,内容如下:

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

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

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

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

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

有人知道为什么性能提升如此显着吗?

【问题讨论】:

  • 您使用的是什么数据库?有关性能的问题高度依赖于数据库。
  • SQL Server 2008 R2。抱歉,刚刚更新了标签

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


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

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2022-01-09
    • 2011-10-12
    • 2012-04-30
    • 2011-01-26
    • 2011-07-02
    • 2015-02-24
    • 2013-08-07
    相关资源
    最近更新 更多