|
||||
|
'ORACLE > SQL' 카테고리의 다른 글
UNION (0) | 2010.01.03 |
---|---|
case (0) | 2010.01.03 |
constraint 제약조건 (primary, foreign , unique,check, default) (0) | 2009.11.02 |
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2 (0) | 2009.09.11 |
ROLLUP , CUBE , GROUPING (0) | 2009.09.02 |
|
||||
|
UNION (0) | 2010.01.03 |
---|---|
case (0) | 2010.01.03 |
constraint 제약조건 (primary, foreign , unique,check, default) (0) | 2009.11.02 |
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2 (0) | 2009.09.11 |
ROLLUP , CUBE , GROUPING (0) | 2009.09.02 |
SQL>set pages 0
SQL>spool emp_insert.sql
SQL>select 'insert into emp(empno,ename) values('''|| empno || ''',''' || ename || ''');' from scott.emp;
SQL>spool off
select 'insert into emp values ('''||컬럼1||''','''||컬림2||''');' from emp;
오라클 시스템 uptime 확인하는 쿼리 (0) | 2010.02.25 |
---|---|
제약조건 확인 (0) | 2010.01.03 |
oracle 실행한 쿼리 조회 (0) | 2009.10.13 |
oracle recycle bin(휴지통) 조회 쿼리 (0) | 2009.10.12 |
아카이브로그 일일 생성 갯수 구하기 (0) | 2009.09.28 |
|
|||||
|
FAST_START_MTTR_TARGET (0) | 2010.01.18 |
---|---|
EXPLAIN PLAN(실행계획) 이란 (0) | 2010.01.12 |
cursor_sharing 파라미터에 대한 테스트 (0) | 2009.12.16 |
Literal SQL 조회하는 방법 (0) | 2009.12.05 |
DML 과 PARALLEL의 관계 (0) | 2009.11.06 |
cursor_sharing 파라미터에 대한 테스트
오라클 데이터베이스의 파라미터 중 cursor_sharing의 value는 exact, similar, force의 값을 가진다. 값의 설정에 따른 영향도와 정확한 동작 방식을 확인하고자 테스트 진행
테스트 시나리오
child cursor이 생기지 않는 형식의 테스트(bind peeking 사용)
1. 테스트 데이터 생성(num의 값이 unique한 10만건 테이블, 인덱스 생성)
2. cursor_sharing 변경(exact, similar, force)
3. 10개의 JOB 등록(각 JOB은 1만번의 루프를 수행하며 루프 마다 ‘where num = 값’의 조건절 중 값이 리터럴하게 변경되면서 수행)
4. 모니터링
child cursor가 생기는 방식의 테스트(bind peeking 사용)는 위의 방식과 동일한 방식으로 진행되지만 조건절을 ‘where num between A and 값’ 형식으로 값을 변경해 가면서 테스트 진행한다.
사용스크립트
simulation_hard_parsing.sh
#!/bin/bash ## $1 =>
Sample Data Row Count ## 등록되는 job을
10 개로 함 ## Hard
Parsing Simulation sqlplus
/nolog <<EOF CONN / AS
SYSDBA GRANT
EXECUTE ON DBMS_SCHEDULER to HR; DECLARE BEGIN FOR C IN 1 ..
10 LOOP
SYS.DBMS_SCHEDULER.DROP_JOB('HR.TEST_SCHEDULE' || '_' ||
C); END
LOOP; END; / CONN
HR/HR -- Make
Test Data @/home/oracle/script/make_sample_data.sql ALL_OBJECTS TEST
$1 -- Index 생성하여 index scan 유도 CREATE
INDEX TEST_IDX ON TEST(NUM,OBJECT_NAME) TABLESPACE
USERS; -- Creation
Procedure for Load DEFINE
P_TOTAL = $1 CREATE OR
REPLACE PROCEDURE CURSOR_SHARING_TEST(P_CNT IN NUMBER DEFAULT 0
) AS V_NUM
NUMBER; V_OBJECT_NAME
VARCHAR2(128); V_OBJECT_ID NUMBER; V_CNT
NUMBER; V_STMT
VARCHAR2(4000); BEGIN V_CNT
:= P_CNT; FOR C IN 1 ..
&P_TOTAL/10 LOOP V_CNT := V_CNT +
1; V_STMT := 'SELECT NUM, OBJECT_NAME, OBJECT_ID
FROM TEST WHERE NUM = ' || V_CNT; EXECUTE IMMEDIATE V_STMT INTO V_NUM, V_OBJECT_NAME,
V_OBJECT_ID; END
LOOP; END; / -- Register
10 Test Schedules CONN / AS
SYSDBA EXECUTE
DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => 'HR',TABNAME => 'TEST' ,
METHOD_OPT => 'for all columns size skewonly' ,DEGREE => 4
,CASCADE => TRUE
); EXEC
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT; ALTER SYSTEM SET CURSOR_SHARING =
EXACT; ALTER
SYSTEM FLUSH SHARED_POOL; ALTER
SYSTEM FLUSH BUFFER_CACHE; DECLARE BEGIN FOR C IN 1 ..
10 LOOP BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME
=> 'HR.TEST_SCHEDULE' || '_' || C
,JOB_TYPE =>
'STORED_PROCEDURE'
,JOB_ACTION =>
'HR.CURSOR_SHARING_TEST'
,START_DATE =>
CURRENT_TIMESTAMP
,JOB_CLASS =>
'DEFAULT_JOB_CLASS' ,COMMENTS => 'cursor_sharing value
test'
,AUTO_DROP =>
FALSE
,NUMBER_OF_ARGUMENTS => 1
,ENABLED =>
FALSE );
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE(NAME => 'HR.TEST_SCHEDULE' || '_' ||
C
,ATTRIBUTE =>
'logging_level'
,VALUE =>
DBMS_SCHEDULER.LOGGING_FULL
);
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(JOB_NAME => 'HR.TEST_SCHEDULE' || '_' ||
C
,ARGUMENT_POSITION => 1 ,ARGUMENT_VALUE =>
&P_TOTAL/10 * C
);
SYS.DBMS_SCHEDULER.ENABLE('HR.TEST_SCHEDULE' || '_' ||
C); END; END
LOOP; END; / EXIT EOF |
ALTER SYSTEM SET CURSOR_SHARING=EXACT 부분을 바꾸어 가면서 테스트 진행
simulation_hard_parsing_child.sh
#!/bin/bash ## $1 =>
Sample Data Row Count ## 등록되는 job을
10 개로 함 ## Hard
Parsing Simulation sqlplus
/nolog <<EOF CONN / AS
SYSDBA GRANT
EXECUTE ON DBMS_SCHEDULER to HR; DECLARE BEGIN FOR C IN 1 ..
10 LOOP
SYS.DBMS_SCHEDULER.DROP_JOB('HR.TEST_SCHEDULE' || '_' ||
C); END
LOOP; END; / CONN
HR/HR -- Make
Test Data @/home/oracle/script/make_sample_data.sql ALL_OBJECTS TEST
$1 -- Index 생성하여 index scan 유도 CREATE
INDEX TEST_IDX ON TEST(NUM,OBJECT_NAME) TABLESPACE
USERS; -- Creation
Procedure for Load DEFINE
P_TOTAL = $1 CREATE OR
REPLACE PROCEDURE CURSOR_SHARING_TEST(P_CNT IN NUMBER DEFAULT 0
) AS V_NUM
NUMBER; V_OBJECT_NAME
VARCHAR2(128); V_OBJECT_ID NUMBER; V_CNT
NUMBER; V_STMT
VARCHAR2(4000); BEGIN V_CNT
:= P_CNT; FOR C IN 1 ..
&P_TOTAL/10 LOOP V_CNT := V_CNT +
1; V_STMT := 'SELECT COUNT(*) FROM TEST WHERE NUM
BETWEEN ' || P_CNT || ' AND ' ||
V_CNT; EXECUTE IMMEDIATE V_STMT INTO V_NUM; END
LOOP; END; / -- Register
10 Test Schedules CONN / AS
SYSDBA EXECUTE
DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => 'HR',TABNAME => 'TEST' ,
METHOD_OPT => 'for all columns size skewonly' ,DEGREE => 4 ,CASCADE
=> TRUE ); EXEC
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT; ALTER SYSTEM SET CURSOR_SHARING =
EXACT; ALTER
SYSTEM FLUSH SHARED_POOL; ALTER
SYSTEM FLUSH BUFFER_CACHE; DECLARE BEGIN FOR C IN 1 ..
10 LOOP BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME
=> 'HR.TEST_SCHEDULE' || '_' || C
,JOB_TYPE =>
'STORED_PROCEDURE'
,JOB_ACTION =>
'HR.CURSOR_SHARING_TEST'
,START_DATE =>
CURRENT_TIMESTAMP
,JOB_CLASS =>
'DEFAULT_JOB_CLASS'
,COMMENTS => 'cursor_sharing
value test'
,AUTO_DROP =>
FALSE
,NUMBER_OF_ARGUMENTS => 1
,ENABLED =>
FALSE
);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE(NAME => 'HR.TEST_SCHEDULE' || '_' ||
C ,ATTRIBUTE =>
'logging_level'
,VALUE =>
DBMS_SCHEDULER.LOGGING_FULL
);
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(JOB_NAME => 'HR.TEST_SCHEDULE' || '_' ||
C
,ARGUMENT_POSITION => 1
,ARGUMENT_VALUE => &P_TOTAL/10 *
C
); SYS.DBMS_SCHEDULER.ENABLE('HR.TEST_SCHEDULE'
|| '_' || C); END; END
LOOP; END; / EXIT EOF |
리터럴 SQL 문장이 between을 사용하는 형태로 바뀌었다.
make_sample_data.sql
-- usage :
1 => Source Table, 2 => Target Table 3 => target Total
Rows define
cnt=idle DROP TABLE
&2 PURGE; CREATE
TABLE &2 AS SELECT
1 NUM, ROWNUM SOURCE_NUM, A.* FROM
&1 A WHERE
1 = 2; COLUMN
TBL_CNT NEW_VALUE CNT SELECT COUNT( * ) TBL_CNT FROM
&1; INSERT INTO
&2 SELECT
A.NUM, B.* FROM
(SELECT LEVEL
NUM FROM
DUAL CONNECT BY LEVEL <= &3) A, (SELECT ROWNUM - 1 NUM,
A.*
FROM &1 A)
B WHERE
MOD(A.NUM, &CNT) = B.NUM ORDER BY
A.NUM; COMMIT; |
테스트 중 측정할 데이터 리스트
l AWR Report
l ASH Report
l EM Performance Graph
l OS 레벨의 vmstat 정보
테스트 결과1 (child cursor이 생기지 않는 시나리오)
먼저 EM의 성능 그래프를 확인해 보자.
성능 그래프를 확인해 보면 역시 예상대로 exact 부분에서 wait 현상이 발생하는 것을 확인할 수 있다.
EAXCT
AWR Report를 살펴 보자
Load Profile
Load
Profile ~~~~~~~~~~~~
Per Second Per
Transaction
---------------
--------------- Redo size: 5,209.31
29,990.00 Logical reads: 1,398.13
8,049.05 Block changes: 16.93
97.48 Physical reads: 21.92
126.21 Physical writes: 5.00
28.76 User calls: 4.18
24.07 Parses: 393.62
2,266.07 Hard parses: 375.25
2,160.33 Sorts: 15.11
87.00 Logons: 0.12
0.67 Executes: 424.32
2,442.79 Transactions: 0.17 |
역시 리터럴 SQL들은 다른 SQL문으로 받아 들여 Hard parse 수치가 높게 나온다.
Instance Efficiency Percentages
Instance
Efficiency Percentages (Target 100%) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 100.00
Redo NoWait %:
100.00 Buffer Hit
%: 98.43 In-memory Sort %: 100.00 Library Hit %:
61.36 Soft Parse %: 4.67 Execute to Parse %: 7.23 Latch Hit %: 99.93 Parse CPU
to Parse Elapsd %: 14.10 % Non-Parse CPU:
58.98 |
역시 Library Hit율이 떨어진다.
Top 5 Timed Events
Top 5 Timed
Events
Avg %Total ~~~~~~~~~~~~~~~~~~
wait
Call Event Waits Time (s)
(ms) Time Wait
Class ------------------------------ ------------ ----------- ------ ------
---------- CPU
time
206
13.3 db file
sequential read 4,788 103 21
6.6 User
I/O os thread
startup 100 85
852 5.5
Concurrenc latch:
library cache 3,541 58 16
3.7 Concurrenc cursor:
mutex X 6 51
8447 3.3
Concurrenc |
Event 중에 latch: library cache에 대한 event가 많음을 확인할 수 있다.
Time Model Statistics
^LTime
Model Statistics
DB/Inst: ORCL/ORCL Snaps:
69-70 -> Total
time in database user-calls (DB Time):
1544.8s ->
Statistics including the word "background" measure background
process time, and so do not contribute to the DB
time statistic ->
Ordered by % or DB time desc, Statistic name Statistic
Name
Time (s) % of DB Time ------------------------------------------ ------------------
------------ sql execute
elapsed time
1,555.0
100.7 parse time
elapsed
1,220.3
79.0 hard parse
elapsed time
508.4
32.9 DB CPU
206.1
13.3 PL/SQL
execution elapsed time 19.6
1.3 connection
management call elapsed time
15.3
1.0 PL/SQL
compilation elapsed time 4.1
.3 hard parse
(sharing criteria) elapsed time
0.8
.1 repeated
bind elapsed time
0.2
.0 hard parse
(bind mismatch) elapsed time
0.1 .0 sequence
load elapsed time
0.0
.0 DB
time
1,544.8
N/A background
elapsed time
221.1
N/A background
cpu time 1.9
N/A |
Time Model의 통계를 확인해 보면 역시나 Hard Parse에 많은 부분을 사용하는 걸 확인할 수 있다.
ASH Report 역시 비슷한 결과에 해당하는 내용이 있다.
SIMILAR
Load Profile
Load
Profile ~~~~~~~~~~~~
Per Second Per
Transaction
---------------
--------------- Redo size: 2,690.38
22,573.94 Logical reads: 1,233.33
10,348.35 Block changes: 8.17
68.58 Physical reads: 17.18
144.13 Physical writes: 1.41
11.81 User calls: 4.13 34.61 Parses: 363.36
3,048.84 Hard parses: 2.68
22.45 Sorts: 11.68
97.97 Logons: 0.11
0.90 Executes: 386.53
3,243.26 Transactions:
0.12 |
같은 테스트지만 Hard parse 부분이 많은 부분 없어진 걸 확인할 수 있다. 파라미터 값을 similar로 변경하여 테스트에 사용한 리터럴 SQL이 동일한 문장은 아니지만 같은 플랜을 사용하게끔 인식이 되는 것이다. 그래서 이미 Library Cache에 존재하는 parsing 정보를 사용하기에 Hard parse를 하지 않게 되었다. 이하의 결과에도 마찬가지의 정보를 보여준다.
Instance Efficiency Percentages
Instance
Efficiency Percentages (Target 100%) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 100.00
Redo NoWait %:
100.00 Buffer Hit
%: 98.61 In-memory Sort %: 100.00 Library Hit %:
97.66 Soft Parse %: 99.26 Execute to Parse %: 5.99 Latch Hit %: 99.76 Parse CPU
to Parse Elapsd %: 27.30 % Non-Parse CPU:
91.17 |
Library Hit율이 97%까지 올라간 결과를 확인할 수 있다.
Top 5 Timed Events
Top 5 Timed
Events
Avg %Total ~~~~~~~~~~~~~~~~~~ wait
Call Event Waits Time (s)
(ms) Time Wait
Class ------------------------------ ------------ ----------- ------ ------
---------- CPU
time
53
13.9 db file
sequential read 4,218 25 6
6.7 User
I/O library
cache load lock 17 3
195 0.9
Concurrenc os thread
startup 13 3
253 0.9
Concurrenc log file
parallel write 123 3 23
0.7 System
I/O |
latch: library cache에 대한 event가 사라진 것을 확인할 수 있다.
Time Model Statistics
^LTime
Model Statistics
DB/Inst: ORCL/ORCL Snaps:
71-72 -> Total
time in database user-calls (DB Time):
378.6s ->
Statistics including the word "background" measure background
process time, and so do not contribute to the DB
time statistic ->
Ordered by % or DB time desc, Statistic name Statistic
Name
Time (s) % of DB Time ------------------------------------------ ------------------
------------ sql execute
elapsed time
386.4
102.1 parse time
elapsed
86.6
22.9 DB CPU 52.6
13.9 PL/SQL
execution elapsed time 38.0
10.0 hard parse
elapsed time
21.6
5.7 PL/SQL
compilation elapsed time
4.8
1.3 connection
management call elapsed time
0.4
.1 repeated
bind elapsed time
0.2
.1 hard parse
(sharing criteria) elapsed time
0.2
.0 failed
parse elapsed time 0.2
.0 sequence
load elapsed time
0.0
.0 DB
time
378.6
N/A background
elapsed time 12.0
N/A background
cpu time
1.6
N/A |
전체적으로 parsing과 관련된 시간이 줄어든 것을 확인할 수 있으며 이를 통해 sql execute elapsed time이 줄어 든 것이 확인 가능하다. 결론적으로 DB time 자체가 줄어드는 성능적인 이득을 취하게 된다. 이것을 다르게 말하면 전체적으로 시스템의 Response Time이 확연히 증가함을 말한다. End 유저는 확실한 성능 차이를 체감하게 될 것이다.
ASH Report로 마찬가지의 결과를 보여주고 있다.
FORCE
Load Profile
Load
Profile ~~~~~~~~~~~~
Per Second Per
Transaction
---------------
--------------- Redo size: 2,340.54
21,036.32 Logical reads: 966.83
8,689.63 Block changes: 8.08
72.63 Physical reads: 13.81
124.08 Physical writes: 1.17
10.50 User calls: 2.42
21.71 Parses: 278.51
2,503.18 Hard parses: 2.97
26.66 Sorts: 9.02
81.08 Logons: 0.08
0.76 Executes: 297.61
2,674.82 Transactions:
0.11 |
similar 의 경우와 비슷한 수치를 보이고 있다.
Instance Efficiency Percentages
Instance
Efficiency Percentages (Target 100%) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 100.00
Redo NoWait %:
100.00 Buffer Hit
%: 98.58 In-memory Sort %: 100.00 Library Hit %:
97.35 Soft Parse %: 98.94 Execute to Parse %: 6.42 Latch Hit %: 99.91 Parse CPU
to Parse Elapsd %: 33.57 % Non-Parse CPU:
93.78 |
similar 의 경우와 비슷한 수치를 보이고 있다.
Top 5 Timed Events
Top 5 Timed
Events
Avg %Total ~~~~~~~~~~~~~~~~~~
wait
Call Event Waits Time (s)
(ms) Time Wait
Class ------------------------------ ------------ ----------- ------ ------
---------- CPU
time 77
13.2 db file
sequential read 4,384 20 5
3.4 User
I/O job
scheduler coordinator slav
1 8 7984
1.4
Other Streams AQ:
qmn coordinator wa 1 5
4884 0.8 Other os thread
startup 13 4
276 0.6
Concurrenc |
latch: library cache에 대한 event가 사라진 것을 확인할 수 있다.
Time Model Statistics
^LTime
Model Statistics
DB/Inst: ORCL/ORCL Snaps:
73-74 -> Total
time in database user-calls (DB Time):
585.2s ->
Statistics including the word "background" measure background
process time, and so do not contribute to the DB
time statistic ->
Ordered by % or DB time desc, Statistic name Statistic
Name
Time (s) % of DB Time ------------------------------------------ ------------------
------------ sql execute
elapsed time
597.6
102.1 parse time
elapsed 122.9
21.0 DB CPU
77.4
13.2 PL/SQL
execution elapsed time 44.4
7.6 hard parse
elapsed time
21.8 3.7 PL/SQL
compilation elapsed time 3.4
.6 hard parse
(sharing criteria) elapsed time
0.7
.1 connection
management call elapsed time
0.2
.0 repeated
bind elapsed time
0.2
.0 failed
parse elapsed time 0.1
.0 sequence
load elapsed time
0.1
.0 hard parse
(bind mismatch) elapsed time
0.0
.0 DB
time
585.2
N/A background
elapsed time
27.2
N/A background
cpu time
2.3
N/A |
similar 때와 비슷한 상황으로 분석된다.
테스트 결과2 (child cursor이 생기는 시나리오)
child cursor의 발생 상황에 대해서 먼저 정의가 필요하다. cursor_sharing 파라미터의 값이 similar일 경우 오라클은 실행계획이 같다고 판단이 되는 경우 동일한 형태의 리터럴 SQL 문장에 대해서 같은 문장으로 인식하고 사용하게끔 한다. 하지만 실행계획은 같지만 포함된 통계정보가 다를 경우 같은 문장으로는 인식을 하지만 재사용을 하는 것이 아니라 child cursor을 생성하여 수행하게 된다. 여기에는 여러 변수가 작용할 수 있다. Bind peeking과 히스토그램, 옵티마이저의 방식 등등이 영향을 미치게 된다.
테스트 시스템은 bind peeking을 사용하며 CBO 방식을 사용했으며 child cursor이 발생하는 환경으로 세팅을 완료했다.
다음은 테스트 결과를 보도록 하겠다.
Similar의 경우 오히려 더 많은 wait event가 발생한 것을 확인할 수 있다.
exact, force인 경우 테스트1의 경우와 비슷한 레벨로 보이고 similar에서는 오히려 성능이 더 떨어지는 그래프를 보이고 있다. 결론적으로 similar인 경우에 대해서는 테스트를 완료할 수 없었다. Child cursor이 3만개 이상 발생하자 Job slave가 terminated 되고 오라클 600에러를 내면서 작업이 fail로 끝나게 된다.
결론
cursor_sharing 파라미터의 경우 많은 부분이 해당 value인 exact, similar, force에 대한 용어적 해석을 통한 접근으로 정확하지 않은 표현으로 가이드 되는 경우가 많다.
테스트의 출발은 위 value가 정확히 어떤 기준으로 동작하는지 확인 하는 것이었다.
Similar인 경우 실행계획이 같은 문장에 한해서는 같은 문장으로 인식하고 library cache에 로딩되어 있는 정보를 그대로 사용한다. 하지만 플랜에 포함된 통계정보가 다르다고 판단이 되는 실행계획일 경우 child cursor을 생성하여 사용하게 된다. 즉 similar인 경우 통계정보까지도 동일한 형태의 실행계획일 경우에 child cursor을 생성하지 않고 사용하게 된다. 반면 force인 경우는 실행계획만 같다면 similar와 다르게 같은 문장으로 인식하여 cache된 정보를 재사용하게 한다.
그렇다면 파라미터에 대해선 어떻게 사용해야할까..?
이는 상황에 따라서 다르겠지만 여러가지를 종합적으로 고려를 해야한다. 분명 가이드는 exact 이다. 그리고 bind 변수 사용에 대해 최대한 권장을 해야한다. 임시방편 격으로 similar, force를 사용 가능하다. 하지만 이것도 고려 사항이 있다. Similar인 경우 child cursor가 발생하는 형식으로 된다면 시스템은 버티기가 힘들 것이다. 즉 사이드 이펙트가 없는 상황일 경우에 쓸만하다는 것이다. 그렇다면 force를 쓰는게 더 낫지 않겠냐는 반문이 나올 것이다. 하지만 이도 문제 요소가 있다. 데이터의 분포가 균등하지 못한 경우 사용되는 변수의 값이 어떤 것이냐에 따라서 적합한 실행계획이 다른 바뀔 것이다. Force의 경우 이런 케이스를 커버하지 못한다는 단점이 있는 것이다.
[출처]
cursor_sharing
파라미터에 대한 테스트|작성자
명품
관
EXPLAIN PLAN(실행계획) 이란 (0) | 2010.01.12 |
---|---|
Statspack Report 간단 분석 방법 (0) | 2009.12.17 |
Literal SQL 조회하는 방법 (0) | 2009.12.05 |
DML 과 PARALLEL의 관계 (0) | 2009.11.06 |
Oracle dump 뜨는 방법 (0) | 2009.05.08 |
오라 클 9.2.0.1에서 Patch 셋 올리기 (0) | 2010.05.31 |
---|---|
oracle enterprise manager 한글 버튼 깨짐 문제 (0) | 2010.01.11 |
Requirements for Installing Oracle 11gR2 RDBMS on RHEL (and OEL) 4 on AMD64/EM64T (0) | 2009.09.07 |
Oracle과 한글 그리고 UTF-8 <네번째> (0) | 2009.09.04 |
Oracle과 한글 그리고 UTF-8 <세번째> (0) | 2009.09.04 |
--------------------------------------------------------------------------------
Syntax SESSION_CACHED_CURSORS
설정방법 Parameter File
ALTER SESSION SET SESSION_CACHED_CURSORS = 100;
ALTER SYSTEM SET SESSION_CACHED_CURSORS = 100;
--------------------------------------------------------------------------------
SESSION_CACHED_CURSORS 파라미터 값이 0보다 크면 Session Cursor Caching 기능이 사용된다.
Session Cursor Caching 기능이란 하나의 Session 내에서 3회 이상 parse call한 커서 SQL
Statement를 PGA 영역에 Cache하는 것을 의미한다.
sql문이 실행될 때마다 세션의 파싱 단계에서 library cache를 검색한다. 하지만 자신이 수행하고자 하는
Execute plan이 없으면 'Hard parsing'을 할 것이고, 있으면 'Soft parsing'을 하게 될 것이다.
"Hard parsing 뿐만 아니라 "Soft parsing"도 librrary cache latch 와 cpu 오버 헤드를 발생시킨다.
일반적으로 Soft Parse가 왕성하고 한번에 많은 수의 Cursor를 사용하는 Application에서는 SESSION_CACHED_CURSORS 파라미터의 값을 크게 함으로써 library cache 래치 경합을 줄일 수 있다.
각각의 커서가 고정된 경우는 이 영역에 대해서 할당할 수 있는 더 많은 shared pool 영역을 요구할 수도 있다. 일반적인 shared pool에서의 커서는 2개의 컴퍼넌트로 구성되어 있다.
a)heap 0 - 1 KB 크기
b)SQL AREA - 4KB 배수 크기
Session Cursor Caching에 의해 PGA에 Cache된 Cursor는 다음과 같은 방법으로 Shared Pool에 Pin된다.
1. Cursor를 구성하는 Heap0(Cursor 기본 정보)은 Pin된다.
2. Cursor를 구성하는 Heap6(Cursor의 실행 계획 정보)는 Pin되지 않는다.
Pin된 영역은 Flush되지 않는다. 따라서 Session Curors Caching에 의해 Cache된 Cursor의
기본 정보는 Shared Pool에 계속 상주하게 된다. 이런 이유 때문에 Cache된 Cursor에 대해서는 Shared
Pool의 특정 영역으로 직접 Access가 가능하고 그 만큼 library cache 래치를 점유하는 시간이 줄어든다. 반면
이렇게 Cache된 Cursor의 개수가 지나치게 많으면 그만큼 Flush되지 않는 Cursor(Heap0)의 수가 증가한다.
따라서 Shared Pool의 Fragmentation 현상이 발생할 수 있다.
이런 이유 때문에 Hard Parse가 왕성한 시스템에서는 Flush가 원활하게 이루어져야 하기 때문에 SESSION_CACHED_CURSORS 파라미터 값을 낮게 설정하는 것이 좋다. 보통 50 정도의 값에서 시작하는 것이 권장되며, Hard Parse와 Soft Parse의 발생 정도, Shared Pool의 크기에 따라 가감하는 방식을 사용한다.
이 파라미터의 동작유무를 체크하려면 다음과 같이 수행한다.
SQL> select max(VALUE) from v$sesstat
where STATISTIC# in(select STATISTIC# from v$STATNAME where NAME = 'session cursor cache count');
MAX(VALUE)
-----------
20
1 rows selected.
과거에 session_cached_cursors의 최대값을 보여주는데, 이 값이 init.ora에서 value = "session_cached_cursors" 라면 이 값을 증가할지를 고려해보야 한다.
이 session cache가 얼마나 얼마나 동작하는지를 보고싶다면 다음과 같이 수행한다.
SQL> select cache/tot*100 "Session cursor cache%"
from
(select value tot from v$sysstat where name = 'parse count (total)'),
(select value cache from sys.v$sysstat where name = 'session cursor cache hits');
Session cur
-----------
8.849e+001
1 rows selected.
결론적으로, OLTP 어플리케이션에서 같은 SQL 세트는 많은 횟수로 실행되기 때문에 반드시 이 파라미터 값을 Default 값이 50 이상으로 세팅할 필요가 있다.
[SGA튜닝]Cursor Sharing Parameter (0) | 2008.06.10 |
---|---|
ORACLE 9i Parameter 설명 (0) | 2007.02.10 |
ORACLE Datatype Limits (0) | 2010.03.05 |
---|---|
데이타펌프 (data pump) 특정 테이블을 익스포트 받지 않을 때 (0) | 2010.02.26 |
oracle 권한확인 (0) | 2009.12.04 |
emca 재구성 (0) | 2009.11.20 |
DBLINK시 LOB CLOB 컬럼오류 해결 (0) | 2009.11.20 |
Statspack Report 간단 분석 방법 (0) | 2009.12.17 |
---|---|
cursor_sharing 파라미터에 대한 테스트 (0) | 2009.12.16 |
DML 과 PARALLEL의 관계 (0) | 2009.11.06 |
Oracle dump 뜨는 방법 (0) | 2009.05.08 |
SQL Trace와 TKPROF 유틸리티 (0) | 2009.03.19 |
☞ 부여된 권한 확인 | |||||||||||||||
●부여받거나 부여한 권한을 확인하기 위해 Dictionary뷰를 액세스한다.
|
♣부여된 권한 확인 | |||||||||||||||||
|
데이타펌프 (data pump) 특정 테이블을 익스포트 받지 않을 때 (0) | 2010.02.26 |
---|---|
sqlplus 환경 설정 (0) | 2009.12.09 |
emca 재구성 (0) | 2009.11.20 |
DBLINK시 LOB CLOB 컬럼오류 해결 (0) | 2009.11.20 |
logminer + 불완전 복구 (0) | 2009.11.19 |
[출처] Oracle Wait Event 모니터링 |작성자 타락천사
shared pool의 heap구조 dump자료 (0) | 2013.06.23 |
---|---|
OWI를 활용한 shared pool 진단 및 튜닝 (0) | 2009.06.30 |
Latch의 발생과 경합의 원인 (0) | 2009.03.09 |
Oracle에서 Latch 가 성능 저하의 원인이 아닙니다 (0) | 2009.03.01 |
Enqueue 와 Latch (0) | 2009.03.01 |