SQL最佳化:很簡單的一篇提高SQL效能的文章!

來源:互聯網
上載者:User
在sql查詢中為了提高查詢效率,我們常常會採取一些措施對查詢語句進行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” 的時候會出現此情況,可以根據情況避免。

相關連結:

PHP-FPM實現效能最佳化,php-fpm效能最佳化

【SQL】MySQL效能最佳化_MySQL

MySQL最佳化視頻教程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.