91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL優化案例-使用with as優化Subquery Unnesting(七)

發布時間:2020-08-08 23:47:16 來源:ITPUB博客 閱讀:197 作者:沃趣科技 欄目:關系型數據庫

使用 no_unnest hint可以讓執行計劃產生filter,即不展開,但一般情況下使用unnest hint無法消除filter。

如下SQL,找出庫中非唯一索引,那么大家可能會這么寫SQL:

SELECT SEGMENT_NAME,SUM(BYTES/1024/1024) m FROM DBA_SEGMENTS WHERE SEGMENT_NAME 
NOT IN (select index_name from dba_indexes where UNIQUENESS ='NONUNIQUE') GROUP BY SEGMENT_NAME;

耗時一分鐘,為什么這么慢呢?在SQL語句where子查詢后有not in、not exists、in、exists時,CBO會嘗試將子查詢展開(unnest)消除filter,但是上面的例子CBO并沒有做到,下面我們看下執行計劃。

SQL優化案例-使用with as優化Subquery Unnesting(七)

我們再看下在子查詢中加unnest hint的執行計劃:

SELECT SEGMENT_NAME,SUM(BYTES/1024/1024) m FROM DBA_SEGMENTS WHERE
SEGMENT_NAME  NOT IN (select /*+UNNEST */index_name from dba_indexes
where UNIQUENESS ='NONUNIQUE') GROUP BY SEGMENT_NAME;

SQL優化案例-使用with as優化Subquery Unnesting(七)

filter消除,CBO將基于數據字典底層的基表重新組合,使執行計劃變成hash joinanti,0.23秒便執行完成了。

下面我們再來看下通過with as materialize優化subquery unnesting的例子。

SQL如下:

select  AREA_NAME,sum(reve)
from t_order o 
where exists (select AREA_ID
        from t_customer c
       where nation = 'Aus'
         and c.AREA_ID = o.AREA_ID
      union
      select AREA_ID
        from f_customer f 
      where nation = 'US'
        and f.AREA_ID <> o.f_area_id) group by AREA_NAME;
selectsum(bytes/1024/1024) M from dba_segments where segment_name ='F_CUSTOMER';
    M
----------
    192

表F_CUSTOMER192M

SQL優化案例-使用with as優化Subquery Unnesting(七)

執行計劃如下:

SQL優化案例-使用with as優化Subquery Unnesting(七)

我們看到并不走索引,要近2個小時執行完成,通過建立組合索引,讓其走index_ffs

CREATE INDEX IDX_FFS_NATION_ID ONf_customer(AREA_ID,nation,0);

SQL優化案例-使用with as優化Subquery Unnesting(七)

8分鐘執行完成,那么還有沒有更好的辦法呢?

如下:

with x as ( select /*+ materialize */ AREA_ID from f_customer f 
      where nation = 'US') 
select  AREA_NAME,sum(reve)
from t_order o 
where exists (select AREA_ID
        from t_customer c
       where nation = 'Aus'
         and c.AREA_ID = o.AREA_ID
      union
      select AREA_ID
        from x where x.AREA_ID <> o.f_area_id) group by AREA_NAME;

SQL優化案例-使用with as優化Subquery Unnesting(七)

在FILTER中,NOT IN(NOT EXISTS)后的SQL語句多次執行,本來數據量就很大,每次都要執行一遍,結果可想而知。但是使用HINT MATERIALIZE和WITH AS 結合使用,把表中部分列實體化,執行過程中會創建基于視圖的臨時表。這樣就不會每次NOT EXISTS都去執行一遍大數據表的掃描或者大的索引快速掃描,并且當表的數據越大,表越寬,這樣的優化效果越明顯。


|  作者簡介

姚崇·沃趣科技高級數據庫技術專家

熟悉Oracle、MySQL數據庫內部機制,豐富的Oracle、MySQL故障診斷、性能調優、數據庫備份恢復、復制、高可用方案及遷移經驗。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

祁连县| 开化县| 威远县| 海伦市| 保定市| 张北县| 双鸭山市| 且末县| 汉源县| 罗山县| 鹰潭市| 都昌县| 都匀市| 诸暨市| 江源县| 府谷县| 五峰| 若尔盖县| 乌海市| 大邑县| 高陵县| 黑龙江省| 新干县| 敖汉旗| 安平县| 左云县| 丰镇市| 武穴市| 仙游县| 临清市| 枣庄市| 兰溪市| 玉环县| 柳林县| 永平县| 罗江县| 厦门市| 金平| 常宁市| 永年县| 华蓥市|