SQL优化:很简单的一篇提高SQL性能的文章!


本文摘自PHP中文网,作者php是最好的语言,侵删。

在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。在某运营商的优化经历中曾经遇到了一条比较有意思的 SQL,具体如下:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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

image

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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)

          rows processed

  

                  PLAN                     GET     DISK    WRITE              ROWS      ROWS USER_IO(MS)  ELA(MS)  CPU(MS) CLUSTER(MS)    PLSQL

END_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

image

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

相关链接:

PHP-FPM实现性能优化,php-fpm性能优化

【SQL】MySQL性能优化_MySQL

MySQL优化视频教程

以上就是SQL优化:很简单的一篇提高SQL性能的文章!的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

sql优化:很简单的一篇提高sql性能的文章!

更多相关阅读请进入《SQL性能优化实现》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...