題記:采用merge語句的非關聯形式确實可以提高update語句的性能,尤其對于百萬級别的資料量,之前的一個關于merge語句的優化案例請參考:
<a href="http://blog.itpub.net/26736162/viewspace-1218671/">http://blog.itpub.net/26736162/viewspace-1218671/</a>
今天發現一個update的更新sql語句跑了1天多的時間了,又是單純的update語句,作為優化工作的我對這種事情肯定不能忍受的,看官請看圖:
select a.SQL_ID,a.SQL_TEXT,a.ELAPSED_TIME2,a.SESSION_TYPES from XB_SQL_MONITOR_LHR a where a.SQL_ID='aaqkudujcm4jp';

其執行計劃:
執行計劃的cost花費有點大喲,,,,
原sql語句:
UPDATE zhui_car_ins_140717_v2 a
SET a.date_of_open =
(SELECT b.date_opened
FROM riskdw.mid_acct_sum b
WHERE a.party_no = b.party_no);
O()︿︶)o 唉,,,,,,這什麼垃圾sql呢?????連個where子句都沒有。。。。。。。,然後發現有全表掃描,看了下sql裡邊設計到非索引列,根據業務,非索引列經常随着索引列出現,那麼就建立聯合索引咯。。。。。,,,,然後再修改為merge語句來更新表:
create index ind_mid_acct_partyno on riskdw.mid_acct_sum(party_no,DATE_OPENED) PARALLEL 20 NOLOGGING;
alter index ind_mid_acct_partyno NOPARALLEL;
先修改為merge語句的關聯形式看看情況:
發現cost花費依然有點高,好吧再優化優化,然後再修改為merge語句的非關聯形式來更新表:
再次執行:
MERGE INTO RISKPUBZCZH.zhui_car_ins_140717_v2 t
USING (SELECT a.rowid AS rowids,
b.date_opened date_opened
FROM riskdw.mid_acct_sum b,
RISKPUBZCZH.zhui_car_ins_140717_v2 a
WHERE a.party_no = b.party_no ) t1
ON (t.rowid = t1.rowids)
WHEN MATCHED THEN
UPDATE SET t.date_of_open = t1.date_opened;
COMMIT;
發現報錯:
看來有非唯一行,這個是merge語句經常出現的問題,那麼修改一下如下:
最終優化後的sql:
MAX(b.date_opened) date_opened
WHERE a.party_no = b.party_no
group by A.ROWID ) t1
優化後的執行計劃:
跑一下呢?
尼瑪,,,,,這麼快,,,,,又是自行車到宇宙飛船的速度的轉變呀。。。。。。。
結尾: 有關merge語句的非關聯形式的sql優化 小麥苗(我的網名)就給大家列舉這2個例子,大家有什麼不懂的可以給我留言,或者加我QQ(642808185)也行。