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",共同学习,共同成长!!!