[CUCURSOR_SHARING]
[CUCURSOR_SHARING] SQL 조건절에 있는 상수 값들을 변수로 전환시켜 parsing 함으로써 cursor를 공유할 수 있도록 해줌 EXACT : 모든 문장이나 변수까지 동일해야 동일한 문장으로 인정 SIMILAR : 문장은 동일하고 바인드 변수값이 다를 경우에도 동일한 문장으로 인정 (12c에서 삭제) FORCE : 문장은 동일하지만 상수값이 다른 sql일 경우에도 동일한 문장으로 인정 |
어플리케이션 운영하다보면 엑셀의 데이타를 주고 데이타 업로드 요청하는 경우가 있습니다.
이럴경우 사용하는 툴(오라클인경우 Toad, 티베로인경우 tAdmin)에서 직접 업로드하여 올리게 되는데...
대량의 데이타를 올리다보면 db상의 쿼리캐쉬메모리 용량 문제가 될수 있습니다.
(티베로 같은경우는 더욱 주의가 필요함. 쿼리캐쉬파일용량의 초과로 DB서버 이슈가 생길수도 있음TT)
왜냐하면, 상수값에 대한 변수처리가 안되어 건거마다 다른 쿼리로 인식하여 쿼리캐쉬메모리에 등재를 하게 됩니다.
insert into z_upload(item_cd, item_nm, unit) values ('aaa01', 'test명1', '개') <-- 서로 다른 쿼리로 인식
insert into z_upload(item_cd, item_nm, unit) values ('aaa02', 'test명2', '개') <-- 서로 다른 쿼리로 인식
insert into z_upload(item_cd, item_nm, unit) values ('aaa03', 'test명3', '개') <-- 서로 다른 쿼리로 인식
: : :
== > insert into z_upload(item_cd, item_nm, unit) values (?, ?, ?) <-- 한개의 쿼리로 재사용됨
이렇게 툴에서도 엑셀업로드하게 되면 insert문으로 모두가 처리가 되므로, 대량의 파일을 업로드시에는 주의해야 합니다.
그러므로, 쿼리캐쉬메모리에 건건 등재하지 않토록 설정하기 위해서는 아래와 같이 옵션설정을 해주면 됩니다.
(예)
alter session set cursor_sharing=force;
insert into z_upload(item_cd, item_nm, unit) values ('aaa01', 'test명1', '개') ;
insert into z_upload(item_cd, item_nm, unit) values ('aaa02', 'test명2', '개') ;
insert into z_upload(item_cd, item_nm, unit) values ('aaa03', 'test명3', '개') ;
......
insert into z_upload(item_cd, item_nm, unit) values ('aaa9999999', 'test명 9999999 ', '개') ;
insert into z_upload(item_cd, item_nm, unit) values ('aaa10000000', 'test명1000000', '개') ;
alter session set cursor_sharing=exact;
* cursor_sharing=force로 하면 constant들을 내부에서 bind화 시켜 주기 때문에,
위 insert 문들을 모두 하나의 쿼리로 재사용할 수 있다고 합니다.
댓글