2013-10-31 3 views
-1

oracle 데이터베이스의 업데이트 문에 문제가 있습니다. 쿼리에 많은 시간이 걸리고 temp 테이블 공간의 공간이 부족하지만 정확한 데이터를 제공합니다.하위 쿼리가있는 Oracle 업데이트 - performanceissue

하위 쿼리를 조인으로 변환하려고했지만 올바르게 수행하는 방법을 찾을 수 없습니다. 누군가 진술을 향상시키는 방법이나 조인으로 변환하는 방법을 알고 있다면 정말 감사 할 것입니다.

 UPDATE table1 t1 
     SET t1.inxdc = (SELECT sda_x 
      FROM table2 t2 
      WHERE t1.c1 = t2.c1 
      AND t1.c2 = t2.c2 
      AND t1.c3 = t2.c3 
      AND t1.c4 = t2.c4 
      AND t1.c5 = t2.c5 
      AND t1.c6 = t2.c6 
      AND t2.ident = 'K_SDA_W' 
      AND rownum=1) 
     WHERE EXISTS 
      (SELECT 1 
      FROM table2 t2 
      WHERE t1.c1 = t2.c1 
      AND t1.c2 = t2.c2 
      AND t1.c3 = t2.c3 
      AND t1.c4 = t2.c4 
      AND t1.c5 = t2.c5 
      AND t1.c6 = t2.c6 
      AND t2.ident = 'K_SDA_W'); 

EDIT1 : 테이블에 대한 일부 정보

  • 표 PK와 = C1, C2, C3, C4, C5, C6
  • 표 2 PK와 = 식별자, C4, C5, C6, 및 PK와 또한 표 2 단 (C1)에
  • 표 데이터 : 12466 행
  • 표 2 DAT 3 명이 (C7, C8, C9)
  • 인덱스 문장에서 언급되지 A : 194,827 행

EDIT2 : 실행 계획

-------------------------------------------------------------- 
    | Id | Operation      | Name     | 
    -------------------------------------------------------------- 
    | 0 | UPDATE STATEMENT    |      | 
    | 1 | UPDATE      | table1    | 
    | 2 | NESTED LOOPS SEMI   |      | 
    | 3 | TABLE ACCESS FULL   | table1    | 
    | 4 | TABLE ACCESS BY INDEX ROWID| table2    | 
    | 5 |  INDEX RANGE SCAN   | t2.c1    | 
    | 6 | COUNT STOPKEY    |      | 
    | 7 | TABLE ACCESS BY INDEX ROWID| table2    | 
    | 8 |  INDEX RANGE SCAN   | t2.PK    | 
    -------------------------------------------------------------- 
+0

더 큰 T1 또는 T2는 어느 것입니까? T1과 T2에 대한 PK는 무엇입니까? 모든 색인? – SriniV

+0

테이블의 크기는 얼마나되며이 업데이트를 실행하는 데 얼마나 걸리나요? 실행 계획을 보여줄 수 있습니까? 하위 쿼리가 일부 인덱스를 사용합니까? 'table1'에서 하나의 관련된 행에 대해 부질의 값을 가져 오는 데 얼마나 걸리나요? –

+0

왜 rownum = 1입니까? T2에 중복이 있습니까? T2> T1 크기를 의미합니까? 계획이란 무엇입니까? – SriniV

답변

0

Table1에, 그냥이 특정 상황에서 WHERE 조항을 삭제하고 하위 쿼리에서 반환 된 값에 NVL를 추가 매우 몇 행이 있습니다

UPDATE table1 t1 
     SET t1.inxdc = NVL((SELECT sda_x 
      FROM table2 t2 
      WHERE t1.c1 = t2.c1 
      AND t1.c2 = t2.c2 
      AND t1.c3 = t2.c3 
      AND t1.c4 = t2.c4 
      AND t1.c5 = t2.c5 
      AND t1.c6 = t2.c6 
      AND t2.ident = 'K_SDA_W' 
      AND rownum=1), t1.inxdc); 

일반적으로 업데이트가 빠릅니다. 하위 쿼리의 성능을 확인 했습니까? 하위 쿼리에 대해 table2에서 색인이 사용되는지 확인하십시오 (가장 좋은 방법은 제외 계획을 보여주십시오).

0

테이블 t2 shoulkd에는 c1, c2, c3, c4, c5, c6, ident에 대한 인덱스가 있다고 생각합니다. 이 경우 t1의 업데이트가 정말 빨라야합니다.