2015-06-30 63 views
6

我有以下查詢。由於其中的子查詢會降低性能。我嘗試了很多添加聯接而不是子查詢。但徒勞無益。任何人都可以告訴我如何使用JOIN重寫此查詢?需要調整此sql查詢以提高性能

update Table_1 
set status = 'Status_2' 
where status ='status_1' and (col_1, col_2, col_3, nvl(col_4,0), col_5) in ( 
       select col_1, col_2, col_3, nvl(col_4,0), col_5 from Table_2 where status ='Status_0'); 

請參閱下面的SELECT * FROM table(DBMS_XPLAN.Display);

Plan hash value: 1290346170 
------------------------------------------------------------------------------------------------------ 
| Id | Operation      | Name     | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------------------------ 
| 0 | UPDATE STATEMENT    |      |  1 | 376 | 456 (3)| 00:00:06 | 
| 1 | UPDATE      | Table_1    |  |  |   |   | 
| 2 | NESTED LOOPS    |      |  |  |   |   | 
| 3 | NESTED LOOPS    |      |  1 | 376 | 456 (3)| 00:00:06 | 
| 4 |  SORT UNIQUE    |      |  1 | 316 | 454 (3)| 00:00:06 | 
|* 5 |  TABLE ACCESS FULL  | Table_2    |  1 | 316 | 454 (3)| 00:00:06 | 
|* 6 |  INDEX RANGE SCAN   | Table1_INDEX   |  1 |  |  1 (0)| 00:00:01 | 
|* 7 | TABLE ACCESS BY INDEX ROWID| Table_1    |  1 | 60 |  1 (0)| 00:00:01 | 
------------------------------------------------------------------------------------------------------`enter code here` 
+2

請運行'EXPLAIN PLAN FOR your_query',然後'SELECT * FROM table(DBMS_XPLAN.Display)',然後複製它的輸出並粘貼到問題中。 – krokodilko

+0

@kordirko,請看看結果。 – Msn

+0

@Msn估計的時間只有6秒,非常快。查詢所花費的實際時間是多少? –

回答

2

當你這樣做時效果會更好嗎?

update 
    (select Table_1.status 
    from Table_1 
     join Table_2 on 
      Table_1.col_1 = Table_2.col_1 
     and Table_1.col_2 = Table_2.col_2 
     and Table_1.col_3 = Table_2.col_3 
     and nvl(Table_1.col_4, 0) = nvl(Table_2.col_4, 0) 
     and Table_1.col_5 = Table_2.col_5 
    where Table_1.status = 'status_1' 
     and Table_2.status = 'Status_0') 
set status = 'Status_2' ; 
+1

這是正確的答案,但@Msn必須注意:如果(col_1,col_2,col_3,col_5)不包含Table_1和Table_2的主鍵,那麼Oracle將拋出一個ORA-01779錯誤(保存鍵的表)。 – acesargl

+0

@ Wernfried,出現錯誤「QL錯誤:ORA-01779:無法修改映射到非鍵保存表的列」。我應該把所有這些coumns的複合鍵嗎? – Msn

0

隨着with語句和Materialized提示,你可以在全局臨時表預裝TABLE_2的數據。這可能會提高查詢的性能。

+0

可以üPLZ添加代碼片段我該怎麼做? – Msn

+0

我可以試試。我在手機上。將ASD作爲(選擇/ * +物化*/col_1,col_2,col_3,nvl(col_4,0),來自表2的col_5,其中status ='Status_0')更新Table_1設置狀態='Status_2',其中status ='status_1'和col_1,col_2,col_3,nvl(col_4,0),col_5)in(select * from ASD) – hsstan

+0

除非公用表表達式被多次使用,否則使用未記錄的物化提示是沒有意義的。 –