我有一个关于Index Scan/Seek的基本问题.当要提取大量行时,索引扫描有效.也就是索引扫描成本与返回的行数成反比.这就是查询变得更加昂贵的行数,因为它必须扫描所有页面,从而导致更多的IO.
我已经搜索了为什么搜索变得比扫描更昂贵但是我无法理解为什么搜索变得昂贵的原因.
我很困惑的是索引搜索.为什么索引搜索变得昂贵,返回的行数更多.索引搜索将始终比扫描更快更有效,因为它直接触摸包含行的页面.因此,即使返回大量行索引,搜索也应始终比索引扫描更有效.但这不会发生.我想知道为什么在某些时候寻求变得昂贵.
select id,name,col1,col2
from TableA -- Will result in index scan. Table has 10000 rows with clustered index on ID column. Query has covering index.
select id,name,col1,col2
where ID between 1 and 10
from TableA -- Optimizer Will use index Seek.
Run Code Online (Sandbox Code Playgroud)
现在,为什么强制索引搜索时下面的查询会变得昂贵 -
select id,name,col1,col2
from TableA with (forceseek)
Run Code Online (Sandbox Code Playgroud)
聚集索引查找比索引扫描昂贵的原因是索引查找开始从根节点到叶节点读取 B 树。这涉及读取叶节点内的索引和页面。因此会导致更多的 IO。因此,当选择性较低时,优化器会选择索引扫描而不是索引查找。只有当返回的记录不超过 2% 到 3% 时,Seek 才比较好。
| 归档时间: |
|
| 查看次数: |
987 次 |
| 最近记录: |