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

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



