ORACLE 性能优化示例

文章目录

    • 问题1:嵌套SELECT和大表关联
    • 问题2:数据量与索引的关系
    • 问题3:分区索引查询
    • 问题4:多层SELECT FROM
    • 问题5:索引跳跃扫描
    • 问题6:索引重复建

问题1:嵌套SELECT和大表关联

结论:尽量少用大表之间关联,特别是外链接,改用嵌套SELECT。

嵌套SELECT(性能优)
ORACLE 性能优化示例_第1张图片
大表关联(性能差)
ORACLE 性能优化示例_第2张图片

问题2:数据量与索引的关系

结论:有索引,但全表扫表时,需要注意传入的参数,不一定是索引不好用。

28万,占用户数10%以上,ORACLE认为全表扫描块
在这里插入图片描述

7万,占用户数比例少,ORACLE用索引查询
在这里插入图片描述

问题3:分区索引查询

结论:利用分区索引查询数据时,查询条件一定要加分区字段。

分区索引,查询条件不带DQBM(性能优)
在这里插入图片描述
分区索引,查询条件带DQBM(性能优)
在这里插入图片描述

问题4:多层SELECT FROM

结论:多层SELECT FROM 就相当于多个视图关联查询,效率差,尽量不用。

优化前:

SELECT TAB2.GZDBH, TAB2.YHBH, TAB2.KHBH AS QXYSLYY, TAB2.KHMC AS YQYY,
       TAB2.YWLBBH, TAB2.YWZLBH, TAB2.ZJRL, TAB2.SQKSRQ, TAB2.SQDQRQ,
       TAB2.HTSPJLDM, TAB2.HTSPSJ, TAB2.HTSPBM, TAB2.HTSPR, TAB2.ZSSLRQ,
       TAB2.GDDWBM
  FROM (SELECT DISTINCT G.GZDBH, TAB0.YHBH, TAB0.KHBH, TAB0.KHMC, G.YWLBBH,
                         G.YWZLBH, G.ZJRL, G.SQKSRQ, G.SQDQRQ, TAB1.HTSPJLDM,
                         TAB1.HTSPSJ, TAB1.HTSPBM, TAB1.HTSPR, G.ZSSLRQ,
                         G.GDDWBM
           FROM FW_YKGZDJBXX G,
                (SELECT K.YHBH, A.KHBH, A.KHMC
                    FROM KH_YDKH K, KH_KHDA A
                   WHERE K.KHBH(+) = A.KHBH) TAB0,
                (SELECT S.GZDBH, S.HTSPJLDM, S.HTSPSJ, S.HTSPBM, S.HTSPR
                    FROM FW_YKHTSPXX S) TAB1
          WHERE G.YHBH(+) = TAB0.YHBH
            AND G.GZDBH = TAB1.GZDBH(+)) TAB2
  JOIN (SELECT Z.ZZBM
          FROM XT_ZZ Z
         START WITH Z.ZZBM = '0306'
        CONNECT BY PRIOR Z.ZZBM = Z.SJZZBM) ZZ
    ON ZZ.ZZBM = TAB2.GDDWBM

ORACLE 性能优化示例_第3张图片
优化后:

SELECT A.GZDBH, 
       A.YHBH,
       (SELECT B.KHBH FROM KH_YDKH B WHERE B.YHBH = A.YHBH AND B.DQBM = A.DQBM) QXYSLYY, 
       (SELECT C.KHMC FROM KH_YDKH B,KH_KHDA C 
        WHERE B.KHBH = C.KHBH AND B.DQBM = C.DQBM
          AND B.YHBH = A.YHBH AND B.DQBM = A.DQBM ) YQYY, 
       A.YWLBBH, A.YWZLBH, A.ZJRL, A.SQKSRQ, A.SQDQRQ,
       (SELECT D.HTSPJLDM FROM FW_YKHTSPXX D WHERE D.GZDBH = A.GZDBH AND D.RWH = A.FAYXRWH AND D.DQBM = A.DQBM) HTSPJLDM,
       (SELECT D.HTSPSJ FROM FW_YKHTSPXX D WHERE D.GZDBH = A.GZDBH AND D.RWH = A.FAYXRWH AND D.DQBM = A.DQBM) HTSPSJ,
       (SELECT D.HTSPBM FROM FW_YKHTSPXX D WHERE D.GZDBH = A.GZDBH AND D.RWH = A.FAYXRWH AND D.DQBM = A.DQBM) HTSPBM,
       (SELECT D.HTSPR FROM FW_YKHTSPXX D WHERE D.GZDBH = A.GZDBH AND D.RWH = A.FAYXRWH AND D.DQBM = A.DQBM) HTSPR, 
       A.ZSSLRQ,
       A.GDDWBM
FROM FW_YKGZDJBXX A
WHERE A.GDDWBM IN (SELECT Z.ZZBM FROM XT_ZZ Z
                   START WITH Z.ZZBM = '0306'
                  CONNECT BY PRIOR Z.ZZBM = Z.SJZZBM)

ORACLE 性能优化示例_第4张图片

问题5:索引跳跃扫描

结论:组合索引时,如果第一个字段的DISTINCT值较少,WHERE条件用组合索引的第二个字段检索时,也会用上该索引。
ORACLE 性能优化示例_第5张图片
在这里插入图片描述

问题6:索引重复建

结论:同一个字段不应该在多个索引的同一个位置重复出现。
SBLBDM在两个索引中都在第一个字段出现,应删除一个。
在这里插入图片描述

你可能感兴趣的:(ORACLE 性能优化示例)