我有一个关于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.
现在,为什么强制索引搜索时下面的查询变得昂贵 -
select id,name,col1,col2
from TableA with (forceseek)
答案 0 :(得分:3)
Clustered index Seek比Index扫描更昂贵的原因是因为Index seek正在从Root节点到Leaf节点开始读取B树。这涉及读取Leaf节点内的索引和页面。因此导致更多的IO。因此,当选择性较差时,优化器选择索引扫描而不是索引搜索。只有当返回的记录不超过2%到3%时,才能获得更好的效果。