点击关注“晓彬聊数据“重磅干货第一时间送达
什么是回表
当对一个列创建索引之后,索引会包含该列的键值以及键值对应行所在的rowid。通过索引中记录的rowid访问表中的数据就叫回表。执行计划中的TABLE ACCESS BY INDEX ROWID就表示回表
select * from dba_objects where owner='SYS'

回表对SQL性能的影响
回表一般是单块读,回表次数太多会严重影响SQL性能,如果回表次数太多,就不应该走索引扫描了,应该直接走全表扫描。Oracle12c及后面版本的新功能批量回表(TABLE ACCESS BY INDEX ROWID BATCHED)在一定程度上改善了单行回表(TABLE ACCESS BY INDEX ROWID) 的性能。
select * from dba_objects where owner='SYS'

什么样的SQL回产生回表
查询列不在索引中就会产生回表。
例如:以下语句一定会产生回表,如果回表次数太多,会严重降低SQL性能。
Select * from table where ...
消除回表
我们通常会建立组合索引来消除回表,从而提升查询性能。当要查询的列也包含在索引中,这个时候就不需要回表了。直接通过rowid对查询到所需要的列数据。
原文始发于微信公众号(晓彬聊数据):深入探索Oracle 回表原理、影响与优化技巧
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
相关推荐
暂无评论内容