SQL Server 查询调优:索引访问方法与基数估计
1. 无序非聚集索引扫描 + 查找
当满足以下条件时,优化器通常会使用无序非聚集索引扫描 + 查找的访问方法:
- 查询具有选择性过滤器。
- 存在包含过滤列的非聚集索引,但该索引不是覆盖索引。
- 过滤列不是索引键列表中的前导列。
例如,对于以下查询:
SELECT orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
WHERE custid = 'C0000000001';
该查询针对在键列 (shipperid, orderdate, custid) 上创建的索引 idx_nc_sid_od_cid 使用了这种访问方法。重要的是, custid 列出现在索引叶行中,但不是第一个键列。
这种访问方法会对索引的叶级别进行完全无序扫描,然后查找符合条件的键。查询必须具有足够的选择性才能使用此访问方法,否则大量的查找操作会比直接扫描整个表更昂贵。为了确定过滤器的基数,SQL Server 需要过滤列上的直方图。通常,创建索引时,SQL Server 会在索引的前导键列上创建包含直方图的统计信息。但在这个例子中,优化器需要 custid 列上的直方图,而它不是索引的前导键列。如果此类统计信息不存在,且数据库属性 AUTO_CREATE_STATISTICS 开启(默认开启),SQL S
超级会员免费看
订阅专栏 解锁全文
8

被折叠的 条评论
为什么被折叠?



