【问题标题】:SQL Server: Add an index for getting a better performance of COUNT()SQL Server:添加索引以获得更好的 COUNT() 性能
【发布时间】:2016-05-09 10:20:29
【问题描述】:

如果有一个表 UserOrder 带有一个聚集的主键(UserID long,OrderID long)。

constraint PrimaryKey_UserOrder primary key clustered ( UserID, OrderID)

我发现在这个表中插入越来越多的记录(> 1 百万)后,以下计数查询会变得越来越慢。

select COUNT(UserID) from UserOrder where UserID = <some value> 

但是,如果我只为 UserID 引入另一个非聚集索引。

create nonclustered index Index_UserOrder_UserID on UserOrder (UserID)

查询会变得更快,因为使用的是新索引而不是主键。

我不确定这个新索引是否真的有助于 COUNT() 的性能。也不知道为什么。

有什么意见吗?

注意:一个用户 ID 可能有数百万个订单。

【问题讨论】:

  • 在比较性能之前,请确保对现有索引进行碎片整理并且统计信息是最新的。现有的聚集索引应该足够了。
  • 您的表将根据复合 PK 进行排序。您在 UserID 上的非聚集索引将允许对键进行快速二进制搜索

标签: sql-server sql-server-2008-r2 query-performance


【解决方案1】:

根据表其余部分的结构,该索引应该有助于提高查询的性能。让我们分解一下。您的集群主键已启用(用户 ID、订单 ID)。因为它是聚集索引,这意味着表中的每个其他列本质上都是一个包含列(即存在于叶级别)。也就是说,在叶级别,索引将变宽。将其与 UserID 上的非聚集索引进行对比。因为在叶级别没有表的其他列(OrderID 除外),所以该索引将更加紧凑,因此需要更少的读取来满足查询。您可以通过使用set statistics io on 并强制您的查询使用任一索引来证明这一点。使用非聚集索引应该执行更少的读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2021-04-17
    • 2015-01-08
    相关资源
    最近更新 更多