暂无图片
为什么有时候索引扫描比全表扫描更慢?
我来答
分享
中天
2023-03-21
为什么有时候索引扫描比全表扫描更慢?

为什么有时候索引扫描比全表扫描更慢?

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新

假设一个表有100万行数据,表的段大小为1GB。如果对表进行全表扫描,最理想的情况下,每次I/O都读取1MB数据(128个块),将1GB的表从磁盘读入buffer cache需要1024次I/O。在实际情况中,表的段前16个extent,每个extent都只有8个块,每次I/O只能读取8个块,而不是128个块;表中有部分块会被缓存在buffer cache中,会引起I/O中断,那么1GB的表从磁盘读入buffer cache可能需要1500次I/O。

从表中查询5万行数据,走索引。假设一个索引叶子块能存储100行数据,那么5万行数据需要扫描500个叶子块(单块读),也就是需要500次物理I/O,然后有5万条数据需要回表,假设索引的集群因子很小(接近表的块数),假设每个数据块存储50行数据,那么回表需要耗费1000次物理I/O(单块读),也就是说从表中查询5万行数据,如果走索引,一共需要耗费大概1500次I/O。如果索引的集群因子较大(接近表的总行数),那么回表要耗费更的物理I/O,可能是3000次,而不是1000次。

根据上述理论,走索引返回的数据越多,需要耗费的I/O次数也就越多,因此,返回大量数据应该走全表扫描或者是Index Fast Full Scan,返回少量数据才走索引扫描。所以,我们一般建议返回表中总行数5%以内的数据,走索引扫描,超过5%走全表扫描。

暂无图片 评论
暂无图片 有用 8
暂无图片
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏