千家信息网

如何提高SQL性能

发表于:2024-11-16 作者:千家信息网编辑
千家信息网最后更新 2024年11月16日,这篇文章给大家分享的是有关如何提高SQL性能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 该最开始的 sql 执行情况如下SQL> SELECT 2 NVL(T
千家信息网最后更新 2024年11月16日如何提高SQL性能

这篇文章给大家分享的是有关如何提高SQL性能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1 该最开始的 sql 执行情况如下

SQL> SELECT  2    NVL(T.RELA_OFFER_SPEC_ID, SUBOS.SUB_OFFER_SPEC_ID) "offerSpecId"  3    FROM OFFER_SPEC_RELA T  4    LEFT JOIN OFFER_SPEC_GRP_RELA SUBOS  5    ON T.RELA_GRP_ID     = SUBOS.OFFER_SPEC_GRP_ID  6    AND subos.start_dt  <= SYSDATE  7    AND subos.end_dt    >= SYSDATE  8    WHERE T.RELA_TYPE_CD = 2  9    AND t.start_dt      <= SYSDATE 10    AND t.end_dt        >= SYSDATE 11    AND (T.OFFER_SPEC_ID = 109910000618 12    OR EXISTS 13      (SELECT A.OFFER_SPEC_GRP_ID 14      FROM OFFER_SPEC_GRP_RELA A 15      WHERE A.SUB_OFFER_SPEC_ID = 109910000618 16      AND T.OFFER_SPEC_GRP_ID   = A.OFFER_SPEC_GRP_ID 17      )) 18    AND rownum<500;no rows selected Execution Plan----------------------------------------------------------Plan hash value: 1350156609

Predicate Information (identified by operation id):---------------------------------------------------   1 - filter(ROWNUM<500)   2 - filter("T"."OFFER_SPEC_ID"=109910000618 OR  EXISTS (SELECT 0 FROM              "SPEC"."OFFER_SPEC_GRP_RELA" "A" WHERE "A"."OFFER_SPEC_GRP_ID"=:B1 AND              "A"."SUB_OFFER_SPEC_ID"=109910000618))   3 - access("T"."RELA_GRP_ID"="SUBOS"."OFFER_SPEC_GRP_ID"(+))   4 - filter("T"."RELA_TYPE_CD"=2 AND "T"."END_DT">=SYSDATE@! AND              "T"."START_DT"<=SYSDATE@!)   5 - filter("SUBOS"."END_DT"(+)>=SYSDATE@! AND "SUBOS"."START_DT"(+)<=SYSDATE@!)   6 - access("A"."SUB_OFFER_SPEC_ID"=109910000618 AND "A"."OFFER_SPEC_GRP_ID"=:B1) Statistics----------------------------------------------------------          0  recursive calls          0  db block gets      12444  consistent gets          0  physical reads          0  redo size        339  bytes sent via SQL*Net to client        509  bytes received via SQL*Net from client          1  SQL*Net roundtrips to/from client          0  sorts (memory)          0  sorts (disk)          0  rows processed                   PLAN                     GET     DISK    WRITE              ROWS      ROWS USER_IO(MS)  ELA(MS)  CPU(MS) CLUSTER(MS)    PLSQLEND_TI I    HASH VALUE EXEC           PRE EXEC PRE EXEC PER EXEC ROW_P    PRE EXEC PRE FETCH    PER EXEC PRE EXEC PRE EXEC    PER EXEC PER EXEC

2 第一次分析
此时应该有以下个地方值得注意
1) 该 sql 每天执行上千次,平均每次执行返回不到 10 行数据,但是平均逻辑读达到1.2W,可能存在性能问题。
2)ID 为 4,5 的执行计划路径中出现了两个全表扫描,看到这儿我们可以想到可能是没有合适的索引导致走了全表扫描从而执行效率低下。
3)ID 为 2 的执行计划路径出现了 FILTER,且 3,和 6 为其子路径,如果FILTER有两个及两个以上的子路径,那么他的执行原理将类似于嵌套循环,id 号最小的子路径如果返回行数较多,可能会导致多次执行id号更小的子路径,导致性能低下。一般存在 "OR EXISTS" 的时候会出现此情况,可以根据情况避免。

感谢各位的阅读!关于"如何提高SQL性能"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0