2017-06-05 100 views
3
explain plan for 
    SELECT * FROM schema2.mv_a_data mv 
     WHERE mv.routing_code_type_id = 3 
     AND mv.static_data_status_id IN(5, 8) 
     AND mv.acct_currency_ind_id NOT IN 
     (SELECT DISTINCT te.acct_currency_ind_id 
      FROM schema1.tem_ele te 
      WHERE te.lis_tem_id IN  
        (SELECT lis_tem_id 
        FROM schema1.lis_tem 
        WHERE lis_tem.template_type_id = 2 
        AND lis_tem.deleted_flag  = 'N'  ) 
     AND te.acct_currency_ind_id IS NOT NULL 
    ) 
ORDER BY mv.treasury_region_code, 
      mv.legal_entity_mnemonic, 
      mv.currency_code; 

select * 
from TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', null,'ADVANCED')); 
------------------------------------------------------------------------------------ 
| Id | Operation    | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT  |   | 892 | 318K| 69 (2)| 00:00:01 | 
| 1 | SORT ORDER BY   |   | 892 | 318K| 69 (2)| 00:00:01 | 
|* 2 | HASH JOIN RIGHT ANTI |   | 892 | 318K| 68 (0)| 00:00:01 | ` 
| 3 | VIEW    | VW_NSO_1 | 1457 | 8742 | 11 (0) | 00:00:01 | 
|* 4 |  HASH JOIN   |   | 1457 | 33511 | 11 (0)| 00:00:01 | 
|* 5 |  TABLE ACCESS FULL | lis_tem | 100 | 1100 |  3 (0)| 00:00:01 | 
|* 6 |  TABLE ACCESS FULL | tem_ele | 3271 | 39252 |  8 (0)| 00:00:01 | 
|* 7 | MAT_VIEW ACCESS FULL| mv_a_data | 2348 | 825K| 57 (0)| 00:00:01 | 

我想讀給定的解釋計劃。根據我的理解,在查看解釋計劃並根據 ,首先完成LIS_TEM表和TEM_ELE的FTS,然後使用HASH JOIN連接它們。閱讀甲骨文解釋計劃

問題1 - 我可以將此HASH JOIN更改爲NESTED LOOP嗎?

我只是問學習的目的。我知道HASH JOIN在這裏很好。 哈希連接後,我想它會去ID3,即查看VW_NSO_1和ID7 MAT_VIEW。

問題2 - 什麼是VIEW VW_NSO_1,SQL查詢的哪個子句負責將它帶到這裏?
問題3 - 我將如何閱讀計劃的其餘部分?
問題4 - 爲什麼HASH JOIN RIGHT ANTI進來?

請幫助我詳細瞭解上述解釋計劃。謝謝,讓我知道你是否需要任何進一步的細節。

回答

0

您可以使用查詢提示'強制'查詢使用特定的連接,但我不會推薦它。如果它使用散列,那麼它可能是最好的事情。確保您的統計是高達日期,如果你認爲它會使用不同的加入

的Oracle文檔是有幫助的看一下每個動作做的更好: https://docs.oracle.com/cd/B10501_01/server.920/a96533/ex_plan.htm

+0

你或某人請回答問題2,3和4? –

0

的觀點VW_NSO_1是在你的內嵌視圖您查詢:

(SELECT DISTINCT te.acct_currency_ind_id 
      FROM schema1.tem_ele te 
      WHERE te.lis_tem_id IN  
        (SELECT lis_tem_id 
        FROM schema1.lis_tem 
        WHERE lis_tem.template_type_id = 2 
        AND lis_tem.deleted_flag  = 'N'  ) 
     AND te.acct_currency_ind_id IS NOT NULL 
    ) 

優化程序已將您的「in」子句轉換爲散列連接。 它也將你的「不在」條款轉換爲散列連接權利反。

所有的表格都很小,所以全掃描沒有什麼值得關注的 - 優化程序可能已經爲您的數據選擇了最好的策略。

+0

謝謝大家。非常有用的信息。 正如我所說我也試圖閱讀這樣的解釋計劃, LIS_TEM的第一個ID5 FTS完成,然後完成TEM_ELE的ID6 FTS。 之後,這兩個表與HASH JOIN連接。 之後「ID3 - VIEW - VW_NSO_1」和「ID7 - MAT_VIEW ACCESS FULL - MV_A_DATA」在同一行中。所以優化器正在掃描MAT_VIEW(前綴mv)的所有WHERE子句以及VW_NSO_1子句。 那麼HASH JOIN RIGHT ANTI如何與ID3和ID7鏈接? –

+0

或HASH JOIN RIGHT ANTI僅與ID3 VIEW鏈接?如果這是正確的,那麼對ID2和ID7的結果進行SORT ORDER BY操作? 或者我不能以這種方式閱讀解釋計劃? 你們可以請你告訴我你將如何閱讀這個解釋計劃? –

2

「我可以將此HASH JOIN更改爲NESTED LOOP嗎?」

您可以嘗試use_nl提示。 Find out more

「什麼是VIEW VW_NSO_1,SQL查詢的哪個子句負責將它帶到這裏?」

VW_NSO_1指示將IN子查詢取消合併到視圖中。這是因爲你的子查詢使用了DISTINCT,所以保證了唯一的集合。此操作未在11g文檔中記錄,但you can find it in the older Tuning Guides.

「我將如何閱讀計劃的其餘部分?「

嗯,並適當注重細節?基本上所有涉及到的表是足夠小,缺乏有用的索引,所以優化一直全面支持全表掃描。

」爲什麼HASH JOIN RIGHT ANTI排在圖片「

NOT IN子查詢作爲一種外部的思考加入你想在MView的記錄不匹配的子查詢行? - 反捧場。你的查詢將會是一個LEFT OUTER JOIN。但是,優化器已經決定了如果先收集子查詢的結果集比評估MView上的反連接(這是一個正確的外連接)會更高效。 Dion Cho在這方面寫了一篇很好的文章。 Find out more