SQL改写优化-带聚合函数的标量子查询改写sum
  IE5LYMWlmdvL 2023年11月12日 29 0

示例

1.造测试数据

SQL> create table dbmt.tobj1 as select * from dba_objects where object_type in ('TABLE','INDEX') and rownum<10000;

Table created.

SQL> create table dbmt.tobj2 as select * from dbmt.tobj1;

Table created.

2.执行改写前测试SQL
—测试sql ,改写前

select a.object_id,(select sum(object_id) from dbmt.tobj2  where owner=a.owner),(select sum(data_object_id) from dbmt.tobj2  where owner=a.owner) from dbmt.tobj1 a;

SQL改写优化-带聚合函数的标量子查询改写sum_sql优化

标量子查询中每行需要读TOBJ2表2次

----改写完成的sql

select a.object_id,x.sum_value,y.sum_value from dbmt.tobj1 a,
(SELECT sum(object_id) sum_value,owner from dbmt.tobj2  GROUP BY owner)x,
(SELECT sum(data_object_id) sum_value,owner from dbmt.tobj2  GROUP BY owner)y
 where a.owner=x.owner(+) and a.owner=y.owner(+);

SQL改写优化-带聚合函数的标量子查询改写sum_sql_02

3.性能对比

—改写前SQL性能

SQL> select EXECUTIONS,BUFFER_GETS/EXECUTIONS gets_per_exec,ELAPSED_TIME/EXECUTIONS  from v$sqlarea where sql_id='3vr66xq0xmn6s';

EXECUTIONS GETS_PER_EXEC ELAPSED_TIME/EXECUTIONS
---------- ------------- -----------------------
         7    8226.71429              45602.4286

Elapsed: 00:00:00.00

—改写后SQL性能

SQL> select EXECUTIONS,BUFFER_GETS/EXECUTIONS gets_per_exec,ELAPSED_TIME/EXECUTIONS  from v$sqlarea where sql_id='d0xsq865xqs8m';

EXECUTIONS GETS_PER_EXEC ELAPSED_TIME/EXECUTIONS
---------- ------------- -----------------------
         7           371              24172.2857

改写前单次执行逻辑读8226
改写后单次执行逻辑读371

SQL> select 8226/371 from dual;

  8226/371
----------
22.1725067

逻辑读减少22倍,符合优化预期

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年05月31日   49   0   0 MySQLSQL
  xaeiTka4h8LY   2024年05月17日   54   0   0 数据库JavaSQL
  xaeiTka4h8LY   2024年05月17日   54   0   0 数据库SQL
  Dk8XksB4KnJY   2023年12月23日   32   0   0 字段字段SQLSQL
IE5LYMWlmdvL