> 아래 어떤분이 비슷한 질문 하셨던데...
> 만일 여러개의 data를 UPDATE하려고 합니다.
> 그런데 그 수가 너무 많아 UPDATE를 하다 ROLLBACK SEGMENT full이 일어날것 같거든요?
> 그래서 rownum을 이용하여 조금씩 잘라서 해주려고 합니다.
>
> UPDATE table_name SET attr='value' where rownum > 0 and rownum <= 100;
> commit;
> UPDATE table_name SET attr='value' where rownum > 101 and rownum <= 200;
> commit;
> ...
>
> 이런 식으로요...
> 만일 10000건이면 1~100, 101~200...이런식으로 해주려고 하거든요? ㅠ_ㅠ
> 다른 방법이 생각이 안 나요.
> 그래서 질문!!!!!!!
> rollback segment에 최대 몇개나 rollback을 해둘수 있는지 알 수는 없나요?
> 1~100 이 아니라, 1~(rollback할수 있는 최대갯수) 로 작업 할려구요.
>
> 정말 초짜이니 많은 도움 부탁드립니다. 그럼 미리 감사드려요!
먼저 상황을 분석하면 대량의 데이타를 한번에 변경할때는 항상 롤백세그먼트가
before data를 저장할 만한 충분한 크기로 확장될 수 있어야 합니다.
그러나 현재 님의 롤백세그먼트 중에서 그런 큰 롤백세그먼트가 없는 것 같군요.
방법은 여러가지가 있습니다.
1. 현재의 롤백세그먼트를 충분히 커질수 있게 환경을 변경시켜주는 것입니다.
롤백세그먼트의 extent 사이크는 변경이 불가능하므로 maxextents를 충분히
크게 잡고 롤백세그먼트가 속한 테이블스페이스를 늘려주는 방법입니다.
2. RBS를 늘리고, 롤백세그먼트를 모두 drop 시킨 후 적절한
extent,optimal size를 지정한 님의 환경에 적당한 롤백세그먼트를 만드는
것이 1번보다 더 좋습니다.
OLTP 에서 일반적인 트랜잭션을 위해서 저는 extent 10MB, Optimal 40MB,
롤백세그먼트 8개, 테이블스페이스 RBS는 500MB를 만듭니다.
( 평균 세션수 500 일때 기준 )
3. 제일 좋은 방법은 별도의 롤백세그먼트를 만듭니다.
보통 대량의 batch 작업을 위한 롤백세그먼트는 따로 잡아주어야 합니다.
저는 일반적인 중급 규모의 DB를 위한 batch성 롤백세그먼트 extent size를
100MB 크기로 하고, 별도의 테이블스페이스 RBS2에 만듭니다.
1,2,3의 방법은 다른 사람들이 전혀 사용하지 않는 상황에서 DBA가 조심스럽게
작업을 진행하셔야 합니다. 오라클 매뉴얼 administrator's guide,
SQL Reference, 튜닝 guide를 참조하세요.
그리고 님께서 만약 100건씩 짤라서 update하고 싶다면
위의 SQL은 원하는대로 작동하지 않습니다.
아래 문장을 계속 실행을 시키셔야 합니다.
이는 rownum 이라는 Pseudo columns의 특성 때문에 그렇습니다.
UPDATE table_name SET attr='value' where rownum < 101 ;
|