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 인덱스를 만들었습니다.
테이블의 다른 잠금을 확인 했습니까? – Donal
예. 자물쇠가 없습니다. 나는 이것을위한 설명 계획을 만들었지 만 비용은 극도로 높습니다. 백만 이상입니다. – user2678464
내가 너라면, 나는 세션을 추적하고 어떤 일이 일어날지를 볼 것이다. – Cyryl1972