2008-10-14 3 views
1

(Sybase 및 MS SQL Server에서) Oracle 프로그래밍에 대해 익히기. 트랜스 로그에 대규모 업데이트를 채우지 않는 "오라클 방식"은 무엇입니까?트랜스 로그 작성을 피하기위한 Oracle SQL 기술

내 구체적인 경우에는 잠재적으로 매우 많은 수의 행을 업데이트하고 있습니다. 업데이트 된 행 개수가 0이 될 때까지 내가 루프 내부에서이 문제를 실행할 경우

UPDATE my_table 
SET a_col = null 
WHERE my_table_id IN 
(SELECT my_table_id FROM my_table WHERE some_col < some_val and rownum < 1000) 

이것이 가장 좋은 방법입니다 ... : 여기 내 접근 방식인가?

감사합니다.

답변

1

여러 번 실행 (예 : 1000 개 레코드)하는 경우 UPDATE를 분할하면 다시 실행 및 실행 취소 로그에 대한 업데이트가 줄어들지 않습니다. 그 위에는 전체 쿼리 시간이 단일 단일 SQL을 실행하는 것과 비교할 때 더 높습니다.

UPDATE에서 UNDO/REDO 로그 문제를 해결할 실제 방법은 없습니다. INSERT 및 CREATE TABLEs를 사용하면 DIRECT aka APPEND 옵션을 사용할 수 있지만이 방법은 쉽게 작동하지 않습니다.

0

모든 UPDATE가 다시 실행됩니다. 현실적으로, 모든 행을 갱신하는 단일 UPDATE는 가장 적은 총 재실행 량을 생성하고 가장 짧은 시간 동안 실행합니다.

A_COL을 사용하는 인덱스가있는 경우 테이블의 대부분의 행을 업데이트한다고 가정하면 업데이트 전에 해당 인덱스를 비활성화 한 다음 나중에 NOLOGGING을 사용하여 인덱스를 다시 작성하는 것이 좋습니다 거대한 UPDATE 문. 또한 업데이트 결과로 해고/유효성 검사가 필요한 트리거 또는 외래 키가있는 경우 일시적으로 제거하여 도움이 될 수 있습니다.

+0

저스틴 인덱스를 사용하지 않도록 설정하는 것은 새로 업데이트 된 NULL 값의 비율이 전체 테이블 크기와 비교할 때 매우 높을 때만 가능합니다. 어쩌면 80-90 % 정도입니다. 완전한 인덱스 재 작성 (기존 인덱스 인덱스가 아닌 처음부터)을 수행하려면 모든 행 정렬이 필요합니다. –

+0

매우 사실입니다. 원래 Rob 게시 한 쿼리를 읽었을 때 some_col

1

숫자와 거의 같은 비율로 표시됩니다. 또한 업데이트로 인해 행이 이전보다 오래 지속되는지 여부에 따라 달라집니다. 모든 행에서 널에서 200 바이트로 이동합니다. 이것은 성능 체인 연결 행에 영향을 줄 수 있습니다.

어느 방법이든 사용해 볼 수 있습니다.

업데이트 대신 선택의 일부로 수정 된 열을 사용하여 새 테이블을 작성하십시오. 로깅을 피할 수있는 CTAS (Select Table as Select)를 통해 새 테이블을 빌드 할 수 있습니다.

원본 테이블을 삭제하십시오.

새 테이블의 이름을 바꿉니다.

색인화는 contrainst을 다시 지정할 트리거를 다시 패키지를 다시 컴파일 등

이 방법을 로깅을 많이 방지 할 수 있습니다.

+0

사실 나는 Tom Kyte로부터 이것을 얻었다. 그러나 나는 그것을 너무 자주 사용했고 오랫동안 내 느낌이 듭니다. ;-) –