天天看點

采用merge語句的非關聯形式再次顯神能 采用merge語句的非關聯形式再次顯神能

題記:采用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';

采用merge語句的非關聯形式再次顯神能 采用merge語句的非關聯形式再次顯神能

其執行計劃:

采用merge語句的非關聯形式再次顯神能 采用merge語句的非關聯形式再次顯神能

執行計劃的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語句的關聯形式看看情況:

采用merge語句的非關聯形式再次顯神能 采用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語句的非關聯形式再次顯神能 采用merge語句的非關聯形式再次顯神能

看來有非唯一行,這個是merge語句經常出現的問題,那麼修改一下如下:

最終優化後的sql:

MAX(b.date_opened) date_opened

WHERE a.party_no = b.party_no

             group by A.ROWID ) t1

優化後的執行計劃:

采用merge語句的非關聯形式再次顯神能 采用merge語句的非關聯形式再次顯神能

跑一下呢?

采用merge語句的非關聯形式再次顯神能 采用merge語句的非關聯形式再次顯神能

尼瑪,,,,,這麼快,,,,,又是自行車到宇宙飛船的速度的轉變呀。。。。。。。

結尾: 有關merge語句的非關聯形式的sql優化 小麥苗(我的網名)就給大家列舉這2個例子,大家有什麼不懂的可以給我留言,或者加我QQ(642808185)也行。