meger into優化案例

SQL:

MERGE INTO TP_B_RB033 TP
USING (SELECT SEQ_NO, PAGE_NUM, FULL_PAGE, ACCT_NO FROM TP_B_RB033_RB_TMP) RES
ON (TP.SEQ_NO = RES.SEQ_NO AND RES.ACCT_NO = TP.ACCT_NO)
WHEN MATCHED THEN
  UPDATE
     SET TP.PAGE_NUM = RES.PAGE_NUM, TP.FULL_PAGE = RES.FULL_PAGE
   WHERE SUBSTR(REPORT_DATE, 1, 6) = SUBSTR(:B1, 1, 6)

執行計劃:

執行計劃口訣:先從最開頭    一直向右看,直到看到最右邊並列的地方,對於並列的地方,從上到下看,靠上的先執行;對於不併列,靠右的先執行;

從執行計劃可以看到 執行順序是 4 6 5 3 2 1,驅動表是 *tmp,走的全表掃描,表連接走的是hash 連接。

據業務人員介紹,每天採集交易數據灌注到*tmp表,然後執行這個sql語句同步數據,完成之後再清理掉*Tmp數據,*tmp表數據不是很大,最大的時候也就2萬。

所以這個場景使用NL是最好的了,驅動表走索引,被驅動表也要創建索引,

如果有環境  可以  測試一下select 和update看看是哪個慢,這樣優化更有針對性。

update 語句的where 條件 ‘WHERE SUBSTR(REPORT_DATE, 1, 6) = SUBSTR(:B1, 1, 6)’需要注意下,對於類似 where id like '%id'是不走索引的,可以改成 ‘WHERE REPORT_DATE like  SUBSTR(:B1, 1, 6)||%’    

總結:

1、*tmp 作爲驅動表,要創建索引,

2、被驅動表 TP_B_RB033數據量比較大, 也要創建索引,

3、優化update ,,,,,,,,where SUBSTR(REPORT_DATE, 1, 6) = SUBSTR(:B1, 1, 6) 爲‘update ,,,,,,, WHERE REPORT_DATE like  SUBSTR(:B1, 1, 6)||%’

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章