대용량의 데이타를 수기로 일괄 업로드 요청하는 경우가 종종 있는데,
보통 아래와 같이 SQL문장으로 실행해서 업로드 처리를 합니다.
이럴 경우 파라메터가 변수로 처리가 아닌 리터럴 값으로 처리가 되어 리터럴 쿼리가 많아 메모리에서 SQL 및 실행계획이 Cache Out 될 수 있습니다.
(일부씩 나눠서 작업하더라도 동일하게 발생함. 심하면 티베로 경우 db가 다운되는경우도 있었음TT)
* 상수값 처리로 모두 다른 쿼리로 인식
INSERT INTO TEST (A, B, C) VALUES ('a1', 'b1',,'c1');
INSERT INTO TEST (A, B, C) VALUES ('a2', 'b2',,'c2');
INSERT INTO TEST (A, B, C) VALUES ('a3', 'b3',,'c3');
:
INSERT INTO TEST (A, B, C) VALUES ('a1000000', 'b3000000',,'c3000000');
COMMIT;
위와 같은 대용량 작업을 할 경우... 아주 효과적으로 사용할 수 있는 방법이 있습니다.
SQL 문장에 있는 상수 값들을 변수로 전환시켜 parsing 함으로써 cursor를 공유할 수 있도록 CURSOR_SHARING 옵션을 이용하면 됩니다.

SQL 조건절에 있는 리터럴 값들을 변수로 전환한 후 파싱하여 커서를 공유할 수 있도록 하는 파라미터로 리터럴 쿼리가 많아 메모리에서 SQL 및 실행계획이 Cache Out 될 경우 효과적이다.
리터럴 쿼리에 의한 하드 파싱 부하가 심한 경우라면 일시적으로 FORCE 옵션의 사용으로 하드 파싱 부하를 줄일 수 있다.
하지만 모든 리터럴이 바인드 변수화되어 실행계획이 바뀔수 있고 컬럼의 히스토그램 정보를 이용할 수 없으므로 사용에 주의해야 하며 애플리케이션에서 바인드 변수를 사용하도록 수정한 후 옵션을 EXACT로 변경하여 사용한다.
[ 설정옵션 ]
– EXACT
: SQL 문장의 텍스트가 완전하게 같아야만 SQL 문장의 커서를 공유할 수 있다.
– FORCE
: 리터럴이 다른 경우에도 SQL 문장의 커서를 공유할 수 있다
[ 사용문법 ]
ALTER SYSTEM SET CURSOR_SHARING={EXACT|FORCE}
ALTER SESSION SET CURSOR_SHARING={EXACT|FORCE}
[ 사용예시 ] 모두 동일 쿼리로 공유
ALTER SESSION SET CURSOR_SHARING=FORCE;
INSERT INTO TEST (A, B, C) VALUES ('a1', 'b1',,'c1');
INSERT INTO TEST (A, B, C) VALUES ('a2', 'b2',,'c2');
INSERT INTO TEST (A, B, C) VALUES ('a3', 'b3',,'c3');
:
INSERT INTO TEST (A, B, C) VALUES ('a1000000', 'b3000000',,'c3000000');
COMMIT;
ALTER SESSION SET CURSOR_SHARING=EXACT;
* 처리후 다시 EXACT로 변경해주세요.

도움이 되셨다면 광고 한번 클릭~!!
'기술' 카테고리의 다른 글
[오라클 & 티베로]쿼리 캐쉬메모리 옵션 설정 CUCURSOR_SHARING (1) | 2023.12.11 |
---|---|
[오라클/티베로]테이블상세정보 및 GRANT권한부여리스트,그외OBJECT(함수,프로시저,트리거,JOB)리스트 (0) | 2023.11.07 |
SVN 접속 계정 사용자 관리 (0) | 2023.06.26 |
[이클립스]이클립스 SVN Repositories 사용 계정확인 변경 및 삭제 (0) | 2023.06.26 |
[티베로/오라클]현재 실행 중인 DB세션 및 쿼리 확인 방법 (0) | 2023.06.20 |