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

溫馨提示×

溫馨提示×

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

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

消除謂詞推進

發布時間:2020-08-10 23:52:10 來源:ITPUB博客 閱讀:211 作者:燕鑫 欄目:關系型數據庫
今天,還是用第一篇博文的例子,看下怎么消除謂詞推進。首先先上圖,這是一個發生了謂詞推進的例子。
sql:

SELECT COUNT(1) AS count

FROM (

   SELECT a.ykf272, a.akb020, a.akb021, a.yka094, a.ake005

      , a.yke936, a.ykf282, a.aac003, a.aac001, a.aac002

      , a.akc225, a.akc226, a.ykf275, a.ykf281, a.ykf284

      , a.ykf283, a.yke453, a.aae011, a.aae036, a.yke923

      , a.yke925, a.yab003, b.yka059, b.yka002, b.yke627

      , b.yka095, a.yke938, a.yke940, x.ake006

      , pkg_common.fun_getAaa103('YKF062', x.ykf062) AS ykf062

      , (

          SELECT c.aaa103

          FROM bm_ykf063 c

          WHERE b.ykf063 = c.ykf063

      ) AS ykf063, b.yka007, x.ykf064

      , (

          SELECT pkg_common.fun_getAaa103('AKA070', c.aka070)

          FROM ka02 c

          WHERE b.yka002 = c.yka002

      ) AS aka070, pkg_common.fun_getAaa103('YKE469', b.yke469) AS yke469, b.aka074

   FROM kz37k1 a, ka05 b, (

      SELECT akb020, ake005, yka094, ake006, ykf062

          , ykf064

      FROM (

          SELECT x.akb020, x.ake005, x.yka094, x.ake006, x.ykf064

              , x.ykf062, DENSE_RANK() OVER (PARTITION BY x.akb020, x.ake005, x.yka094 ORDER BY aae030 DESC) AS r

          FROM kb05k1 x

      )

      WHERE r = 1

   ) x

   WHERE a.yka094 = b.yka094

      AND a.akb020 = x.akb020

      AND a.ake005 = x.ake005

      AND a.yka094 = x.yka094

      AND a.akb020 = '855855'

      AND a.yab003 = '0001'

      AND trunc(a.aae036, 'dd') >= '08-APR-18'

      AND trunc(a.aae036, 'dd') <= '10-APR-18')a;


執行計劃:
消除謂詞推進

我們看到id=7這里發生了謂詞推進。我們來看下謂語信息。
消除謂詞推進


      注意到id=7那里只是一個filter,所以謂詞推進并不是發生在這一步,這里只是告訴你標黃的子查詢部分發生了先被謂詞推入然后作為一個整體參與后續的步驟。那真正發生謂詞推入的地方在哪里呢?可以看到id=7到id=11最先執行的應當是id=11,而且這里循環了43782次,
也就是說,這一步索引范圍掃描重復了43782次,我們往上看與第7步并列的是id=3,他們的父步驟id=2就是嵌套循環,而id=3最終得到的結果集(這一步的a-rows)就是43782行,這就不奇怪了,id=3的結果集作為驅動表,而id=7的結果集作為被驅動表,確實該發生這么多次循環,
但問題是,id=7的這個結果集并不是作為一個整體被遍歷了43782次,而是從索引范圍掃描就開始循環了,這是為什么呢?
     我們看到sql中標黃部分的子查詢,完全可以自成一體,只遍歷一次,就可以得到想要結果集,為什么要遍歷43782次,(這里其實是已經做過優化的,之前是max()函數,自聯結的一個查詢,為了不讓這里被多次遍歷,用分析函數優化了自聯結),這時候我們就該看看id=11的謂詞信息是什么,
id=11顯示走了index_..._AKE005的索引,謂詞信息表明它具體走了索引的哪寫列,發現本該在where條件中的x表和a表的連接條件出現在了這里,這就是導致這里發生了43782次循環的根源,這里發生的就是謂詞推入,把本不該是子查詢的條件推入到子查詢中,明顯這里不適合這樣做。

     現在我們發現了問題的原因,那么怎么能阻止謂詞推入呢?我們去找找outline部分里面對應該行為的hint。
消除謂詞推進


    找到了,就是這里,所以很簡單了,我們只需要把這句復制出來,把push_pred改成no_push_pred,然后再把它加入到第一個select后面的hint中。
消除謂詞推進

現在我們再看執行計劃:
消除謂詞推進

我們看到id=4的starts列變為1,表明這個子查詢現在是按照我們理想的只執行了一次。

小結一下:

      謂詞推入是cbo一種優化的行為,但是謂詞推入并不總是好的,如果謂詞被推入后縮小了結果集,降低了邏輯讀,那就是好的,反之就不太好,其實cbo并不是只要有謂詞推入的機會就會推入,由于統計信息不準確,傾斜的列上沒有直方圖,都會導致cbo在計算cost
的時候產生較大偏差,而對于大的業務表,數據變化頻繁,也不能總收集統計信息,所以這時候我們就需要去找到合適的hint來協助cbo做出最優的選擇。














向AI問一下細節

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

AI

江阴市| 禄丰县| 包头市| 赫章县| 历史| 迭部县| 绥德县| 义马市| 孟津县| 冀州市| 邮箱| 宜都市| 临漳县| 祁东县| 祁连县| 宁陵县| 阆中市| 运城市| 宝应县| 邓州市| 类乌齐县| 灵寿县| 饶阳县| 黄石市| 龙门县| 商南县| 大理市| 拉萨市| 信宜市| 新乡县| 望奎县| 乌拉特中旗| 合水县| 攀枝花市| 报价| 大姚县| 临湘市| 西乌珠穆沁旗| 新源县| 礼泉县| 葫芦岛市|