网站首页 > 技术文章 正文
作者:炎燚小寳
原文链接:http://www.tdpub.cn/Blog/detail/id/1293.html
环境
oracle:11.2.0.4
os:rhel6.9
前言
用户有条SQL跑出结果,还报ORA-01555的问题,我们看下这条SQL。
一、SQL文本
select a.kprq,
a.fpdm,
a.fphm,
a.fpzt_bz,
a.xfsbh,
a.xfmc,
a.xf_qxswjg_dm,
a.gf sbh,
a.gfmc,
a.gf_qxswjg_dm,
b.mc,
b.ggxh,
b.spbm,
b.sl,
b.jldw,
b.dj,
b.je,
b.se,
a.jshj
from AA a, BB b
where a.fpdm || a.fphm = b.fpdm || b.fphm
and a.kprq >= to_date('20220901', 'yyyymmdd')
and a.kprq <= to_date('20220930', 'yyyymmdd')
and a.gfsbh in ('1',
'2',
'3',
'4',
'5',
'6',
'7',
'8');
二、SQL执行情况
执行计划
三、问题分析及优化思路
从执行计划可以看出,该SQL主要问题就在于BB超大表的全表扫描,同时跟用户确认,该SQL最终返回结果不多。查看关联列,是有索引的,那为什么没有走索引?
仔细看SQL文本,发现关联条件是这样的:a.fpdm || a.fphm = b.fpdm || b.fphm,怪不得走不了索引,针对这样的写法,我们最好建议改下关联方式:a.fpdm = b.fpdm and a.fphm = b.fphm,最终用户接受了该方案。
如果代码写死无法改SQL咋办?也有办法,在被驱动表上创建一个以关联条件的虚拟列,在该虚拟列上创建索引即可优化,有兴趣的读者可以自行验证。
四、优化方案
(一)、改写SQL
(二)、被驱动表创建虚拟列,并在该列创建索引
五、优化效果对比
通过确认关键表数据量,制定执行计划,可以减少每次查询的逻辑读和物理读,提高SQL执行性能。
(一)、优化后的执行计划
略
(二)、优化前后资源消耗对比
猜你喜欢
- 2024-11-15 Oracle中where条件查询和排序的性能比较 ?
你 发表评论:
欢迎- 610℃几个Oracle空值处理函数 oracle处理null值的函数
- 603℃Oracle分析函数之Lag和Lead()使用
- 590℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 589℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 582℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 576℃【数据统计分析】详解Oracle分组函数之CUBE
- 566℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 557℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)