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 |
--------------------------------------------------------------
더 큰 T1 또는 T2는 어느 것입니까? T1과 T2에 대한 PK는 무엇입니까? 모든 색인? – SriniV
테이블의 크기는 얼마나되며이 업데이트를 실행하는 데 얼마나 걸리나요? 실행 계획을 보여줄 수 있습니까? 하위 쿼리가 일부 인덱스를 사용합니까? 'table1'에서 하나의 관련된 행에 대해 부질의 값을 가져 오는 데 얼마나 걸리나요? –
왜 rownum = 1입니까? T2에 중복이 있습니까? T2> T1 크기를 의미합니까? 계획이란 무엇입니까? – SriniV