2014-11-14 6 views
0

9 백만 레코드가있는 테이블이 있습니다. 요구 사항은 다음과 같습니다. 1. 테이블에 9 백만 개의 레코드가 삽입됩니다. 각 항목에는 트리거를 사용하여 테이블에 삽입되는 ROWID가 있습니다. 2. First_Insatance 및 First_Instance_Date라는 동일한 테이블에서 별도로 업데이트해야하는 두 개의 열이 있습니다. 3.이 첫 번째 인스턴스 열은 테이블에있는 중복 레코드의 첫 번째 Rowid 번호를 보유해야합니다. 우리는 쿼리가 3050 개 기록 35 초를 복용하지만, 4L의 레코드를 실행하면됩니다SQL 업데이트 쿼리가 영원히 계속 실행 중입니다. 오라클 성능 튜닝 팁 필요

UPDATE TABLE_A T4 
     SET (T4.ROW_ID_FIRST_INS, T4.ROW_ID_DT_FIRST_INS) = 
      ( SELECT MIN (T3.ROW_ID), MIN (T3.UPDATE_DATE) 
        FROM TABLE_A T3 
       WHERE  T3.SOURCE(+) = T4.SOURCE 
         AND SUBSTR (T3.TABLE_NAME, 
             1, 
             REGEXP_INSTR (T3.TABLE_NAME, 
                '\_[0-9]{8}T', 
                1, 
                1, 
                0)) 
          || SUBSTR (T3.TABLE_NAME, 
             REGEXP_INSTR (T3.TABLE_NAME, 
                '\_[0-9]{8}T', 
                1, 
                1, 
                1), 
             LENGTH (T3.TABLE_NAME) 
             - REGEXP_INSTR (T3.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 1)) = 
           SUBSTR (T4.TABLE_NAME, 
             1, 
             REGEXP_INSTR (T4.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 0)) 
           || SUBSTR (T4.TABLE_NAME, 
             REGEXP_INSTR (T4.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 1), 
              LENGTH (T4.TABLE_NAME) 
             - REGEXP_INSTR (T4.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 1)) 
         AND NVL (T4.I_NAM, 'xx') = 
           NVL (T3.I_NAM, 'xx') 
         AND NVL (T4.J_NAM, 'xx') = NVL (T3.J_NAM, 'xx') 
         AND NVL (T4.SYS_NAM, 'xx') = 
           NVL (T3.SYS_NAM, 'xx') 
         AND NVL (T4.TG_TAB_NAM, 'xx') = 
           NVL (T3.TG_TAB_NAM, 'xx') 
         AND NVL (T4.PK, 'xx') = NVL (T3.PK, 'xx') 
         AND NVL (T4.ERR, 'xx') = 
           NVL (T3.ERR, 'xx') 
         AND NVL (T4.VAL, 'xx') = 
           NVL (T3.VAL, 'xx') 
         AND NVL (T4.ID, 'xx') = NVL (T3.ID, 'xx') 
       GROUP BY T4.FIELD, 
         T4.ERR, 
         T4.VAL, 
         T4.ID, 
         T4.PK, 
         T4.I_NAM, 
         T4.SYS_NAM, 
         T4.J_NAM) 
    WHERE T4.CURRENT_LOAD_ID = some number FROM CURSOR; 

를 업데이트하려면 아래의 코드를 사용하는

. 그것은 지난 2 일 동안 멈추지 않고 달리기도하지 않습니다.

ROW_ID는 PK과 크기를 4000

감사했다 몇 가지를 제외하고 열을 기준으로 모든 그룹에 NU 인덱스를 만들었습니다.

+0

테이블의 다른 잠금을 확인 했습니까? – Donal

+0

예. 자물쇠가 없습니다. 나는 이것을위한 설명 계획을 만들었지 만 비용은 극도로 높습니다. 백만 이상입니다. – user2678464

+0

내가 너라면, 나는 세션을 추적하고 어떤 일이 일어날지를 볼 것이다. – Cyryl1972

답변

0

별칭을 사용하여 중복을 결정하는 지나치게 복잡한 방법을 사용하는 것처럼 보입니다. 이 줄을 따라 더 간단한 것을 통합하려고합니다. 그것이 어렵다 ID를 가진 수 (ID)> 테이블 구조없이 1

, 일부 샘플 데이터 및 문제에 대한 자세한 설명으로 표 그룹에서 ID를 선택 은 더 많은 일을 할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 샘플 데이터를 제공 할 수 있습니다 : – user2678464

+0

응답 해 주셔서 감사합니다. 나는 당신에게 샘플 데이터를 제공 할 수 ROW_ID COL1 COL2 COL3 날짜 first_ins이 1 ABC SYSDATE 1 SYSDATE 2 EFG SYSDATE 2 SYSDATE 3 ABC SYSDATE + 1 SYSDATE 4 ABC SYSDATE + 2 1 SYSDATE 5 HIJ SYSDATE + 2 first_ins_dt 5 SYSDATE + 2 위의 데이터에서 첫 번째 인스턴스와 첫 번째 인스턴스 열은 데이터가 반복되는 모든 곳의 첫 번째 rowid와 날짜를가집니다. 이것은 내가 매우 높은 양의 데이터를 얻기 위해 필요한 것입니다. – user2678464