SQL Server:“单例查找”和“用户查找”之间有什么区别?

Acc*_*_CO 6 index sql-server index-statistics

Microsoft 将[user_lookup]计数器描述dm_db_index_usage_stats为“用户查询的书签查找次数”。[singleton_lookup_count]它将in描述dm_db_index_operational_stats为“从索引或堆检索单行的累积计数”。这对我来说一点也不清楚。有人可以对这两个值所跟踪的内容提供更清晰的定义/区分吗?

这个问题源于今天的索引观察(800m 行表),其中[user_lookup]Cx 的当前值约为 800,而[singleton_lookup_count]超过 10 亿。显然,他们计算的是许多不同的事物,我需要了解它们是什么,以及这种程度的差异是否表明存在问题。

Pau*_*ite 10

这些计数器并不总是容易解释,原因我将很快解释。它们可以作为一个有用的指标,您可能需要更详细地分析某些领域。

这个问题源于今天的索引观察(800m 行表),其中 Cx 上的当前 [user_lookup] 值约为 800,[singleton_lookup_count] 超过 10 亿。

该值表示访问聚集索引或堆的user_lookup书签查找运算符(KeyRID Lookup )在执行计划中出现了 800 次。

该值包括使用KeyRID Lookupsingleton_lookup_count运算符查找的行数。它还计算对聚集索引每个非查找的保证单行访问。当聚集索引是唯一的并且使用一个或多个相等查找谓词时,就会发生这种情况。

例查找是保证最多找到一条匹配记录的 B 树遍历。对于应用于唯一索引的每个可查找相等谓词都是这种情况。

例如,如果是唯一索引键并且使用索引查找,select id from table where id in (1, 2, 3, 4)则会导致四个单例查找。id请注意,不使用书签查找。

Key或RID Lookup只不过是使用等式谓词的唯一索引查找,因此它们被视为相同

即使基表是堆或聚集索引不唯一,查找也始终针对唯一的“索引”。对于堆,唯一的行定位符是堆 RID。对于非唯一聚集索引,唯一行定位符是聚集索引键加上任何“唯一符”(仅适用于实际重复的键)。

索引使用统计

索引使用统计数据 DMV 包含从查询执行器(QE) 角度来看的索引操作计数。这是负责执行查询计划的 SQL Server 组件。

姓名 描述
用户搜索 Index Seek 运算符出现在已执行计划中的次数。
用户扫描 表扫描或索引扫描操作符出现在已执行计划中的次数。
用户查找 RID 或键查找运算符出现在已执行计划中的次数。

这些计数器递增的方式并不完全直观:

  • 每个计划执行都会对操作员计数一次
  • 生成估计计划不会影响总数。
  • 在单个计划执行中执行 10,000 次的Index Seek仍然只为用户搜索计数添加 1。
  • 即使根本没有执行操作符,也会对其进行计数。

指数运行统计

索引操作统计数据 DMV 包含从存储引擎(SE)角度来看的索引和表操作的计数。

姓名 描述
范围扫描计数 堆或索引结构上的范围扫描(包括无限制的完整扫描)的数量。
单例查找计数 堆或索引结构中的单例查找数。

此 DMV 对每个存储引擎操作进行计数,使计数器可能更直观:

  • 10,000 次单例查找将为单例查找计数列添加 10,000
  • 执行 5 次的表扫描将使范围扫描计数加 5 。

有关显示每个计数器何时递增的示例,请参阅我的文章Seeking Without Indexes