ORACLE SUBPOOLS
from metalink ID 455179.1
from http://askdba.org/weblog/2008/03/shared-sub-pools
1.
ORACLE SUBPOOLS
SUBPOOLS 의 수는 다음의 요소로 결정된다.
-CPU 수 (CPU_COUNT)
-SHARED_POOL_SIZE
SUBPOOLS 은 9.2.0.5 부터 가능하다.
SUBPOOLS 은 ORA-4031 의 해결안으로도 언급된다. (여기서는 언급하지 않음)
SUBPOOLS 할당으로 SHARED MEMORY 구조를 보호하기 위한 LATCH 경합을 줄일 수 있다고 한다. 일례로 shared pool 을 sub pools 로 구성하게 되면 shared pool 에 하나씩 할당되는 latch : shared pool 을 sub pools 수만큼 가질 수 있게 된다.
2.
SUB POOLS
A.
CPU
CPU 수에 따른 SUBPOOLS 의 수는 METALINK 자료에 의하면 다음의 공식으로
구한다고 한다.
@max_lists_by_cpu = ((cpu_count -1) >>
2) + 1
i.e,
1-4 CPU’s = 1 subpool
5-8 CPU’s = 2 subpools
9-12 CPU’s = 3 subpools
max_lists_by_cpu 의 ‘>>’ 가 도대체 무얼 의미하는지 의문이지만 간단하게 이야기
해서 cpu_count 4 당 subpool 하나가 할당된다고 보면 될 듯 하다.
B.
MEMORY
-MANUAL SHARED MEMORY
MANAGEMENT(shared_pool_size)
subpool 에
대한 최소할당량은 9i 128m ,10g 256m ,11g 512m 이다.
세부버전에 대한 할당량은 다음과 같다. (askdba.org 참조)
9.2.0.5 – 9.2.0.8 : 128Mb per subpool
10.1.0.1-10.2.0.3 : 256Mb per subpool
10.2.0.4 > : 512 Mb
11.1.0.6 > : 512 Mb
결과적으로 CPU, MEMORY 에 대해 위와 같은 방법을
이용해 min(a b) 를 사용한다.
다시말해 메모리가 아무리 커도 cpu_count 1-4 값이라면 subpool 은 하나가 된다.
C.
_kghdsidx_count
min(a b) 로 정해지는 값이 아니라 사용자가 subpools 수를 고정할 수 있다.
3.
주의사항
SHARED_POOL_SIZE, CPU_COUNT 는 DYNAMIC 변경이 안된다. 다시 말해 DB 의 RESTART
가 필요하다.
_kghdsidx_count 를 직접 변경하더라도 CPU, MEMORY 에 대한 제약을
벗어나지 못한다.
실제 환경을 구성하면 좋겠지만 CPU 의 제약은 크다;;
아래는 11g R2 에서
shared_pool_size = 1600m 에 _kghdsidx_count = 2 로
변경한 내용이다. cpu_count 값은 변경을 하더라도 실제 시스템 환경에 의해 원복된다. 실제 하드웨어 스펙에서 내려가는 건 가능해도 오버하는 건 안되는 것 같다.
(ex: 쿼드코어
환경에서 cpu_count 를 2로 내리는건 되도 8로 올리는건 불가능)
/*+ test case 추가 cpu_count 를 down */
SQL> @parameter
Enter value for name:
kghdsidx
old 7: AND KSPPINM like lower('%&NAME%')
new 7: AND KSPPINM like lower('%kghdsidx%')
NAME SESMO SYSMOD DESCRIPTION
-------------------- -----
--------- ----------------------------------------
_kghdsidx_count FALSE FALSE max kghdsidx count
parameter 를 조회한 화면이다.
scope=memory|both 가 안됨을 알 수 있다. 다시 말해 db restart 가 필요하다.
SQL> alter system set
"_kghdsidx_count"=2 scope=spfile;
System altered.
SQL> startup force;
ORACLE instance started.
Total System Global
Area 351543296 bytes
Fixed Size 1336428 bytes
Variable Size 293604244 bytes
Database Buffers 50331648 bytes
Redo Buffers 6270976 bytes
Database mounted.
Database opened.
SQL> show parameter
_kghdsidx
NAME TYPE VALUE
------------------------------------
----------- ------------------------------
_kghdsidx_count integer 2
hidden parameter 를 한번 수정하면 show
parameter 로 볼 수 있다. 아까 변경한 대로 2
가 되었다. 참고로 cpu_count 값을 변경한
경우 restart 시점에 값이 원복된다.
ora112@/home/oracle>ipcs
-m
------ Shared Memory
Segments --------
key shmid owner
perms bytes nattch
status
0x00000000 65536 oracle
600 393216 2
dest
0x00000000 98305 oracle
600 393216 2
dest
0x00000000 131074 oracle
600 393216 2
dest
0x00000000 163843 oracle
600 393216 2
dest
0x00000000 196612 oracle
600 393216 2
dest
0x00000000 229381 oracle
600 393216 2
dest
0x00000000 262150 oracle
600 393216
2 dest
0x00000000 294919 oracle
600 393216 2
dest
0x00000000 327688 oracle
600 393216 2
dest
0x18ee5fe4 589833
oracle 660 356515840 26
shared memory 에 대해 조회한 화면이다. key
0x00000…. 은 db startup 이전에도 있었던 값으로 무시하면 된다. subpool 이 실질적으로 구성이 되면 shared memory 에
대해 key 를 가지는 값이 하나 더 있어야 한다. 위의
화면을 보면 하나밖에 존재하지 않음을 알 수 있다.