sql优化案例(索引创建不合理)

SQL Monitoring Report

SQL Text
------------------------------
INSERT INTO FS_PAY_DET_INFO
(PAY_DET_ID,
PAY_INFO_ID,
GC_TYPE_CODE,
GRA_PQ,
PAY_GRA_AMT,
PUR_PQ,
PAY_PUR_AMT)
SELECT PKG_SP_SEQ.F_A_RCVBL_PL_FLOW_RCVBLID,
A.PAY_INFO_ID,
C.GC_TYPE_CODE,
SUM(DECODE(G.DISC_MODE, '13102', B.T_SETTLE_PQ, 0)) GRA_PQ,
SUM(A.PAY_GRA_AMT) PAY_GRA_AMT,
SUM(DECODE(G.DISC_MODE, '13103', B.T_SETTLE_PQ, 0)) PUR_PQ,
SUM(A.PAY_PUR_AMT) PAY_PUR_AMT
FROM FS_PAY_INFO A, E_CONS_PRC_AMT B, E_GP_SNAP C, E_CAT_PRC G
WHERE A.CALC_ID = B.CALC_ID
AND A.CALC_ID = C.CALC_ID
AND A.PAY_YM = B.YM
AND A.ORG_NO = B.ORG_NO
AND B.PARA_VN = G.PARA_VN
AND B.PRC_CODE = G.PRC_CODE
AND B.ORG_NO = :B3
AND B.YM = :B2
AND B.APP_CODE = :B1
GROUP BY A.PAY_INFO_ID, C.GC_TYPE_CODE;

 

 执行计划观察到:

 该步骤消耗大量资源且时间长。

分析FS_PAY_INFO表:
select num_rows,LAST_ANALYZED from dba_tables where table_name='FS_PAY_INFO';

NUM_ROWS LAST_ANALYZED
6541065       2020/4/15 0:05:30

select column_name,num_distinct from dba_tab_col_statistics where table_name='FS_PAY_INFO';

COLUMN_NAME NUM_DISTINCT
CALC_ID             6541065
PAY_YM              70

CALC_ID选择性比PAY_YM高出很多。

添加索引:
create index xx.IDX_FS_PAY_CALC_ID on xx.FS_PAY_INFO (CALC_ID) parallel 4 online tablespace xx;
alter index xx.IDX_FS_PAY_CALC_ID noparallel;

添加索引后,执行计划如下:
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

Predicate Information (identified by operation id):
---------------------------------------------------

7 - filter(("B"."YM"='202006' AND "B"."ORG_NO"='3xxx2'))
8 - access("B"."APP_CODE"='2xxx2')
9 - filter("B"."PRC_CODE"="G"."PRC_CODE")
10 - access("B"."PARA_VN"="G"."PARA_VN")
11 - filter(("A"."PAY_YM"='202006' AND "A"."ORG_NO"='3xxx2'))
12 - access("A"."CALC_ID"="B"."CALC_ID")
13 - access("A"."CALC_ID"="C"."CALC_ID")

添加索引后速度为毫秒。

原文地址:https://www.cnblogs.com/muzisanshi/p/13048300.html