SQL优化策略:如何避免不必要的回表操作
创作时间:
作者:
@小白创作中心
SQL优化策略:如何避免不必要的回表操作
引用
CSDN
1.
https://blog.csdn.net/zgt_certificate/article/details/140939309
什么是回表
回表是指在使用索引查询数据库时,由于索引本身不包含所需的所有列,数据库需要根据索引中存储的rowid去表中读取完整数据行的过程。回表通常会造成额外的I/O操作,因为每个rowid对应一个具体的数据块,导致SQL性能降低。
回表对性能的影响
- I/O次(读块)数:回表是一个单块读操作。每次回表都会增加I/O操作次数,影响查询性能。
- 查询性能:如果需要回表的次数过多,可能会使索引扫描的优势丧失,反而不如直接进行全表扫描。
如何判断回表对性能的影响
从执行计划中可以看到,TABLE ACCESS BY INDEX ROWID步骤标识了回表操作。这种操作在实际应用中,需要评估回表次数对性能的影响。
SQL执行计划分析
以下是执行计划中的一些关键部分:
SQL> select * from test where owner='SYS';
30808 rows selected.
Execution Plan
--------------------------------
Plan hash value: 3932013684
--------------------------------------------------------
| Id | Operation | Name | Rows | ... |
--------------------------------------------------------
| 0 | SELECT STATEMENT | | 2499 | ... |
| 1 | TABLE ACCESS BY INDEX ROWID | TEST | 2499 | ... |
| *2 | INDEX RANGE SCAN | IDX_OWNER | 2499 | ... |
--------------------------------------------------------
- INDEX RANGE SCAN:这是索引范围扫描,通过索引快速定位相关记录的rowid。
- TABLE ACCESS BY INDEX ROWID:这是回表操作,根据rowid从表中读取所需的完整行数据。
为什么会有回表
- 查询中使用了SELECT *:需要返回整行数据。
- 索引列不包含查询的所有需要列:索引中可能缺少查询中所需的列。
SQL执行计划性能分析
从执行计划中的性能统计可以看出,这个SQL查询回表占用了较多的资源,尤其是在以下几个方面:
- consistent gets:一致性读操作的次数。在第一次查询中,consistent gets为74次,而设置arraysize=5000后为877次,说明通过优化arraysize可以减少传输开销。
- rows processed:处理的行数。说明查询结果包含30808行数据。
详细举例
为了更好地理解回表的影响,下面以两个例子来说明如何优化SQL以减少回表:
例子1:使用更少的列
有一个订单表orders,有以下字段:order_id,customer_id,order_date,total_amount。而且customer_id上有索引。
原始查询:
SELECT * FROM orders WHERE customer_id = 12345;
- 问题:查询使用SELECT *,需要返回整行数据,导致需要回表获取完整记录。
优化查询:
SELECT order_id, order_date, total_amount FROM orders WHERE customer_id = 12345;
- 仅选择需要的列,减少不必要的I/O开销。
例子2:创建复合索引
有一个员工表employees,包含字段:employee_id,department_id,hire_date,salary。查询中经常需要根据department_id和hire_date筛选数据,而这两个字段没有同时出现在一个索引中。
原始查询:
SELECT employee_id, salary FROM employees WHERE department_id = 10 AND hire_date > DATE '2020-01-01';
- 问题:查询中有多个条件,但只有department_id有索引,导致可能需要回表。
优化方案:创建复合索引
CREATE INDEX idx_emp_dept_date ON employees(department_id, hire_date);
- 通过创建复合索引,能够覆盖查询中所需的条件,减少回表操作。
热门推荐
哪个国家进口挪威三文鱼价格最高?中国为何偏好大规格三文鱼?
基于51单片机的温控风扇设计
ChatGPT两周年,国产o1大模型们紧追不舍
如何有效预防痤疮?简单生活习惯助您远离痘痘
动物如何找到食物?全面了解动物觅食与觅食策略
吉林省:服务和监管结合 筑牢化工企业大检修“防火墙”
医保报销范围及报销比例是怎样的
五角星的水果是什么?杨桃的全面介绍
整装与半包装修合同模板的法律解析及应用指南
暗物质宇宙的奥秘可以通过鲁宾天文台来解开
启动新一轮人事调整,北汽瞄准自主品牌“翻身仗”
肱二头肌的训练方法
身份证上的是阳历还是阴历有什么影响
如何透过财务报表看出税务风险?附10大风险预警指标
过敏性鼻炎怎么检测过敏源?三种常见检测方法详解
工伤保险基金支付范围包括什么
西安化觉巷古玩街:古都文化探索与千年珍宝淘宝指南 🏺
【传统文化】亮相央视!成都出土的“扁鹊医书”首次数字复现
松茸保存方法大揭秘,松茸保质期一般多久?
不同气候政策下影响城市经济前景的关键主题
自制油条,1碗面粉能做3大筐,步骤详细简单,外酥里嫩个个酥脆
数据库如何查询年龄
精选内容集|健康美味吃出好身材 低卡低脂餐灵感分享
IE工业工程:如何确定生产瓶颈和制约因素
梦境解析:房屋倒塌的象征意义,心理启示
"脆皮年轻人"背后:代表委员关注青年健康三大隐患
乙肝病毒核心抗体:临床意义、检测方法及注意事项
揭秘东北奇观:辽宁的自然美景与文化瑰宝之旅
路边桃树上的桃胶能吃吗?专家建议:不要采、不要吃!
护肝的西药有哪些