Oracle case when改写SQL
Oracle case when 改写 SQL
--- 说明:案例来自《 收获,不止SQL 优化 》
创建测试数据:
SQL > drop table t1 purge ;
SQL > drop table t2 purge ;
SQL > create table t1 as select * from dba_objects ;
SQL > create table t2 as select * from dba_objects ;
SQL > update t2 set status = 'INVALID' WHERE ROWNUM <= 10000 ;
SQL > update t2 set generated = 'Y' WHERE ROWNUM <= 10000 ;
SQL > update t2 set temporary = 'Y' WHERE ROWNUM <= 10000 ;
SQL > update t2 set temporary = 'M' WHERE temporary <> 'Y' ;
SQL > update t2 set temporary = 'Q' WHERE temporary <> 'Y' or temporary <> 'M' ;
SQL > COMMIT ;
SQL > set autotrace traceonly
SQL > set linesize 1000
原 SQL :
SQL>
select t1.object_name,
t1.object_id,
(select count(*)
from t2
where temporary = 'Y'
and t2.object_id = t1.object_id) CNT_TEMPORARY_Y,
(select count(*)
from t2
where created >= sysdate - 365
and t2.object_id = t1.object_id) CNT_CREATED_NEW,
(select sum(object_id)
from t2
where status <> 'VALUD'
and t2.object_id = t1.object_id) SUM_OBJID_STATUS_V,
(select sum(object_id)
from t2
where generated = 'Y'
and t2.object_id = t1.object_id) SUM_OBJID_GENERATED_Y,
(select sum(object_id)
from t2
where generated = 'M'
and t2.object_id = t1.object_id) SUM_OBJID_GENERATED_M,
(select sum(object_id)
from t2
where generated = 'Q'
and t2.object_id = t1.object_id) SUM_OBJID_GENERATED_Q
from t1
where t1.object_id <= 50;
case when改造 后的 SQL :
with w_t2 as
(select
t2.object_id,
count(case when t2.temporary='Y' then 1 end ) CNT_TEMPORARY_Y,
count(case when created >=sysdate-365 then 1 end ) CNT_CREATED_NEW,
sum(case when t2.status<>'VALID' then t2.object_id end ) SUM_OBJID_STATUS_V,
sum(case when t2.generated = 'Y' then t2.object_id end ) SUM_OBJID_GENERATED_Y,
sum(case when t2.generated = 'M' then t2.object_id end ) SUM_OBJID_GENERATED_M,
sum(case when t2.generated = 'Q' then t2.object_id end ) SUM_OBJID_GENERATED_Q
from t2
group by t2.object_id)
select t1.object_name,t1.object_id,w_t2.* from t1,w_t2
where t1.object_id=w_t2.object_id
and t1.object_id<=50;
结论: SQL 改写后 T2 表访问次数由 6 次降到 1 次,逻辑读 consistent gets 由 320100 降到 2580 ,性能有所提升。
欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341