2. Cursor_Sharing
2010.07.17 23:44
- 바인드 변수 사용 원칙을 지키지 않아 라이브러리 캐시 경합이 일어날 경우 경합을 일시적으로 해결하기 위하여 cursor_sharing 파라메터를 변경할 수 있다.
▣ 예제
- Dynamic SQL을 만들고 Literal 상수를 제공했다. -> 커서 공유를 하지 않는다.
alter session set cursor_sharing = exact; (DEFAULT)
- alter session set cursor_sharing = force;를 사용하면 커서를 공유한다.
- force 이면 컬럼 히스토그램을 사용하지 못하므로 고정된 실행계획을 사용한다.
- force 단점을 해결하기 위해 similar 옵션을 사용할 수 있다. 히스토그램이 없으면 force와 같고, 있으면 exact와 같다.
값 분포가 일정하지 않는 컬럼은 히스토그램을 만든다.
히스토그램의 값의 경우 수가 많을 경우 EXACT 보다 더 느릴 수 있다.
create table emp_t as select * from emp; create index emp_empno_idx on emp_t(empno); analyze table emp_t compute statistics for table for all indexes for columns empno size 1; show parameters cursor_sharing; alter session set cursor_sharing = force; alter system flush shared_pool; set serveroutput on; declare l_condition varchar2(20); l_ename emp_t.ename%type; begin for c in ( select empno from emp_t ) loop l_condition := 'empno = '|| c.empno; execute immediate 'select ename ' || 'from emp_t where ' || l_condition into l_ename; dbms_output.put_line( l_condition ||' : ' || l_ename ); end loop; end; / select sql_id, sql_text, version_count from v$sqlarea where sql_text like 'select ename%'; select sql_id, child_number chld_no, plan_hash_value plan_hash, loads, parse_calls, executions, fetches from v$sql where sql_text like 'select ename%'; SQL_ID CHLD_NO PLAN_HASH LOADS PARSE_CALLS EXECUTIONS FETCHES ------------- ---------- ---------- ---------- ----------- ---------- ---------- 6y7xpur0d4jty 0 3220957464 1 12 12 12 (alter session set cursor_sharing = force;를 사용하지 않으면 아래 결과가 나온다.) SQL> select sql_id, child_number chld_no, plan_hash_value plan_hash, loads, pars fetches 2 from v$sql 3 where sql_text like 'select ename%'; SQL_ID CHLD_NO PLAN_HASH LOADS PARSE_CALLS EXECUTIONS FETCHES ------------- ---------- ---------- ---------- ----------- ---------- ---------- 7btg75m1un6mh 0 3220957464 1 1 1 1 4z85t036cstxu 0 3220957464 1 1 1 1 8t1hstds8svrg 0 3220957464 1 1 1 1 1p0dw95jhp6f1 0 3220957464 1 1 1 1 4k5uyn3kq1jkf 0 3220957464 1 1 1 1 1qsw3fn3j5pqr 0 3220957464 1 1 1 1 2kwq0tcdfa9b4 0 3220957464 1 1 1 1 9a3p6t37v2q3d 0 3220957464 1 1 1 1 2xauzardzur0f 0 3220957464 1 1 1 1 72127hc1t6zdw 0 3220957464 1 1 1 1 d4sqtxgazkzns 0 3220957464 1 1 1 1 9mjc6sbjubgsc 0 3220957464 1 1 1 1 |
- cursor_sharing은 일시적으로 바인드변수에 대한 하드파싱 문제를 해결할 수 있지만 완전한 해결책은 아니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
67 | 진행기록 | 운영자 | 2011.08.23 | 6588 |
66 | 3. Deterministic 함수 사용 시 주의사항 | 실천하자 | 2010.07.19 | 10590 |
65 | 6. RAC 캐시 퓨전 | 토시리 | 2010.07.19 | 12634 |
64 | 부록 | 휘휘 | 2010.07.19 | 7238 |
63 | 8. I/O 효율화 원리 | 휘휘 | 2010.07.19 | 7742 |
62 | 7. Result 캐시 | 휘휘 | 2010.07.19 | 12969 |
» | 2. Cursor_Sharing | balto | 2010.07.17 | 10215 |
60 | 1. Library Cache Lock | balto | 2010.07.17 | 12803 |
59 | 1. 블록 단위 I/O | 토시리 | 2010.07.12 | 9381 |
58 | 7. PL/SQL 함수의 특징과 성능 부하 | 실천하자 | 2010.07.12 | 12607 |
57 | 3. Single Block vs. Multiblock I/O | 휘휘 | 2010.07.12 | 9172 |
56 | 2. Memory vs. Disk I/O | 휘휘 | 2010.07.12 | 7439 |
55 | 6. 페이지 처리의 중요성 | 실천하자 | 2010.07.11 | 6820 |
54 | 8. PL/SQL 함수 호출 부하 해소 방안 | 토시리 | 2010.07.11 | 14031 |
53 | 5. Direct Path I/O | balto | 2010.07.10 | 12192 |
52 | 4. Prefetch | balto | 2010.07.10 | 28443 |
51 | 6장. I/O 효율화 원리 | 휘휘 | 2010.07.08 | 6404 |
50 | 3. 데이터베이스 Call이 성능에 미치는 영향 | 토시리 | 2010.07.07 | 11667 |
49 | 2. User Call vs. Recursive Call | 토시리 | 2010.07.07 | 9050 |
48 | 5장. 데이터베이스 Call 최소화 원리 | 휘휘 | 2010.07.05 | 6103 |