2012-03-12 2 views
1

나는 내부 선택 쿼리가 77 개 행을 반환하고 몇 밀리 초 단위로 실행이 Oracle SQL 삭제 쿼리의 성능을 어떻게 향상시킬 수 있습니까?

DELETE /*+ parallels(fe) */ FROM fact_x fe 
WHERE fe.key NOT IN(
    SELECT DISTINCT di.key 
    FROM dim_x di 
    JOIN fact_y fa 
    ON fa.code   = di.code 
    WHERE fa.code_type = 'ABC' 
); 

다른 테이블에서 선택 쿼리의 결과에 따라 테이블에서 원하지 않는 행을 삭제되었다. 하지만 외부 삭제 쿼리는 8 시간 이상 영원히 실행됩니다. 나는 count (1)을 선택하기 위해 삭제를 변환함으로써 얼마나 많은 행이 삭제되어야하는지 계산하려고 시도했다. 그리고 그 총량은 총 6680 만 행 중 6640 만 fact_x 행이었다. 나는자를려고하지 않습니다. 나머지 행을 유지해야합니다.

다른 방법이 있습니까? PL/SQL 커서를 실행하여 삭제하면 더 잘 작동합니까?

답변

7

보관할 행을 다른 테이블에 삽입 한 다음 기존 테이블을 삭제하는 것이 더 바람직하지 않습니까?/etc를 비활성화/재 작성하려는 FK가 있더라도. 그것은 거의 확실합니다.

+0

나중에 시도 할 내용입니다. 아마 커서로 대량 삭제를 시도하는 것보다 빠를 것이라고 짐작할 수 있습니다. –

1

"toBeDeleted"열을 추가 할 수 있습니까? 설정 쿼리는 "NOT IN"구성을 필요로하지 않습니다. 표시된 행을 삭제하는 것은 "단순"해야합니다.

는 다시, 67 백만 행의 99,4 %를 삭제하면 시간이 좀 걸릴 것입니다.

+0

내부 쿼리 속도가 느린 문제는 아닙니다. 그것은 오라클 롤백 세그먼트와 삭제 중에 발생하는 다시 실행 로그 때문에 발생합니다. 나는 톰에게 묻습니다. http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::P11_QUESTION_ID:2345591157689 –

+0

그런 다음 자주 발생하면 삭제해야합니다. 거의 모든 테이블에서 [JNK] (http://stackoverflow.com/a/9670575/121309)의 대답을 사용하십시오. –

0

시도해보십시오/* + parallel (fe) * /. "S"가 없습니다.

관련 문제