国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SQL優化之子查詢展開

IT那活兒 / 866人閱讀
SQL優化之子查詢展開

點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!!


  
發現一個SQL執行了半個小時,結果還沒出來,找到我們幫忙分析優化一下。
這是一個典型的子查詢被展開導致sql執行計劃變差的案列。sql語句中三張表a、b、c關聯查詢,b和c表在外面,a在in里面。



 調優過程


原始SQL如下:

SELECTDISTINCTCASE
WHEN REGEXP_LIKE(B.REGISTERORGID, .XM) THEN
SUBSTR(B.REGISTERORGID,
1,
INSTR(B.REGISTERORGID, .XM, 1) - 1)
ELSE
B.REGISTERORGID
END,
B.SERVNUMBER,
C.RECOPID,
C.RECDATE,
B.SUBSID
FROM TBCS.SUBSCRIBER PARTITION(SUBSCRIBER_724) B,
TBCS.RECEPTION PARTITION(RECEPTION_724_202202) C
WHERE B.NETTYPE = GSM
AND B.ACTIVE = 1
AND B.STATUS = US10
AND B.CREATEDATE > TO_DATE(20220201, YYYYMMDD)
AND B.REGISTERORGID LIKEHB.JM.03.%
AND C.SERVNUMBER = B.SERVNUMBER
AND C.RECDATE > TO_DATE(20220201, YYYYMMDD)
AND C.RECDEFID = Install
AND B.SUBSID NOTIN
(SELECT  A.SUBSID
FROM TBCS.SUBS_PRODUCT PARTITION(SUBS_PRODUCT_724) A
WHERE A.PRODID LIKEG238354%
AND A.APPLYDATE > TO_DATE(20220201, YYYYMMDD)
UNIONALL
SELECT  A.SUBSID
FROM TBCS.SUBS_PRODUCT PARTITION(SUBS_PRODUCT_724) A
WHERE A.PRODID = MP9990103000300
AND A.APPLYDATE > TO_DATE(20220201, YYYYMMDD)
UNIONALL
SELECT/*+ index(a IDX_SUBS_PRODUCT_PRODID) */
A.SUBSID
FROM TBCS.SUBS_PRODUCT PARTITION(SUBS_PRODUCT_724) A
WHERE A.PRODID IN (SELECT D.PRODID
FROM TBCS.PRODUCT D
WHERE D.PRODNAME LIKEXX%XXX%
OR D.PRODNAME LIKEXX%XXX%
OR D.PRODNAME LIKEXX%XXX%%
OR D.PRODNAME LIKEXX%XXX%%
OR D.PRODNAME LIKE%XX%
OR D.PRODNAME LIKE%XX%)
AND A.APPLYDATE > TO_DATE(20220201, YYYYMMDD))
ORDERBYCASE
WHEN REGEXP_LIKE(B.REGISTERORGID, .XM) THEN
SUBSTR(B.REGISTERORGID, 1, INSTR(B.REGISTERORGID, .XM, 1) - 1)
ELSE
B.REGISTERORGID
END,
C.RECDATE;
SQL整理完成后在adg上進行測試,發現在執行過程中產生gc cr request等待事件,執行很長時間結果也出不來。
在多帶帶把子查詢SQL拿出來執行發現not in里面的SQL運行的非常快不到一秒就完成,但是聯合B表一起執行的時候就非常慢,也產生了gc cr request等待。
此時多帶帶把B,C表關聯查詢不要not in發現結果只有5000多行,如下:
如此來看可以嘗試讓B,C優先關聯,關聯完成后再去not in里面與A的結果進行過濾,子查詢不展開。
在子查詢里面加入no_unnest的hint后一分鐘即出現結果:
修改前執行計劃如下:
修改后執行計劃如下:



 分析總結


子查詢展開(Subquery Unnesting)是優化器處理帶子查詢的目標sql的一種優化手段。

它是指優化器不再將目標sql中子查詢當作一個獨立的處理單元來多帶帶執行,而是將該子查詢轉換為它自身和外部查詢之間等價的表連接。
這種等價連接轉換要么是將子查詢展開(即將該子查詢中的表,視圖從子查詢中拿出來,然后和外部查詢中的表,視圖做表連接),要么是不拆開但是會把該子查詢轉換為一個內嵌視圖(Inline View)然后再和外部查詢中的表,視圖做表連接。
子查詢展開通常都會提高原sql的執行效率,因為如果原sql不做子查詢展開,那么通常情況下該子查詢就會在其執行計劃的最后一步才被執行,并且會走filter類型的執行計劃,這也就意味著對于外部查詢所在結果集的每一條記錄,該子查詢就會被執行多少次。
在此次sql優化中,外部B、C表關聯后結果集很小,且子查詢里面sql全部走的索引,嘗試子查詢不展開,用B、C關聯后的結果集去關聯子查詢,效率明顯提升
由此可見,子查詢展開并不一定會提高sql執行效率,是否展開,依據不同的情況進行選擇。

本文作者:袁 鋼(上海新炬王翦團隊)

本文來源:“IT那活兒”公眾號

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129420.html

相關文章

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<