树形查询的优化案例

针对数仓系统中一条执行缓慢的SQL查询进行分析,发现因统计信息不准确导致Oracle估算错误,出现标量子查询重复扫描大表的问题。通过收集统计信息和使用cardinality hint优化执行计划,成功将查询时间从5小时降低到80秒。
摘要由CSDN通过智能技术生成

某数仓系统一条SQL执行了很长时间,要求分析原因

使用如下查询获取时间段内SQL语句的执行情况

select count(1),sql_id
  from dba_hist_active_sess_history
 where to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') >
       '2018-07-13 12:03:57'
   and to_char(sample_time, 'yyyy-mm-dd hh24:mi:ss') <
       '2018-07-13 17:13:57'
       group by sql_id
order by 1 desc;

1	1772	4wy3j1nz5rs1u
2	795	
3	781	73830bz989abk
4	637	g3f5uca2xtxbp

可知4wy3j1nz5rs1u执行了1772*10s,大约5小时,通过SQL_ID 定位到SQL语句和执行计划如下:

WITH T AS
 (SELECT CRDT_CTR_ID
    FROM USERUSER.S14_AAAA_AAA_H T1
   INNER JOIN USERUSER.S11_CCCC_CCCC_INFO_H B
      ON T1.Crdt_Main_Pty_Id = B.Corp_Cust_Id
     AND B.DATA_SRC_CD = 'CMS'
     AND B.ST_DT <= date '2018-07-12'
     AND B.END_DT > date '2018-07-12'
   WHERE T1.ST_DT <= date '2018-07-12'
     AND T1.END_DT > date '2018-07-12'
     AND T1.CRDT_CTR_STATUS_CD IN ('CMS0_A', 'CMS0_AV'))
SELECT CONNECT_BY_ROOT(T1.CRDT_CTR_ID),
       T1.CRDT_CTR_ID,
       T1.CRDT_DUE_DT,
       T1.CRDT_PRD_ID,
       T1.APRVED_LMT,
       T1.SPEC_CRDT_FLG,
       T1.CRDT_MAIN_PTY_ID,
       T1.CCY_CD
  FROM USERUSER.S14_AAAA_AAA_H T1
 WHERE T1.ST_DT <= date '2018-07-12'
   AND T1.END_DT > date '2018-07-12'
 START WITH T1.ST_DT <= date '2018-07-12'
        AND T1.END_DT > date'2018-07-12'
        AND T1.CRDT_CTR_STATUS_CD IN ('CMS0_A', 'CMS0_AV')
        AND T1.CRDT_CTR_ID IN (SELECT CRDT_CTR_ID FROM T)
CONNECT BY NOCYCLE PRIOR T1.CRDT_CTR_ID = T1.PARENT_CRDT_CTR_ID;



Plan hash value: 696009752
 
-------------------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值