반응형

Result Cache를 사용할 때와 사용하지 않을 때 사용하는 래치는 어떤 차이가 있는지 확인해 보자

시나리오는 간단하다 . DB를 재 기동 후 v$latch 의 정보를 저장해 놓은 후 쿼리 수행 전 후의 래치 사용량을 비교 하는 것이다.

- Test Case#1


일반 쿼리 수행 시 쿼리 수행 전/후 의 래치 사용량 비교



- Normal.sql

   -- Before
       SELECT name ||','|| to_char(gets) FROM v$latch order by name ;
   -- Execute Query
       SELECT count(*) FROM test_rc ;
   -- After
       SELECT name ||','|| to_char(gets) FROM v$latch order by name ;
exit;

sqlplus hr/hr @Normal.sql >> Normal.txt


다음 결과는 쿼리 수행 전/후의 래치 사용량 변화가 있는 래치를 나타낸 것이다.



ASM map operation hash table
DML lock allocation
Event Group Locks
FOB s.o list latch
File State Object Pool Parent Latch
IPC stats buffer allocation latch
In memory undo latch
JS Sh mem access
JS queue access latch
JS slv state obj latch
KFC FX Hash Latch
KFC Hash Latch
KFCL LE Freelist
KFR redo allocation latch
KGNFS-NFS:SHM structure
KGNFS-NFS:SVR LIST
KJC message pool free list
KJCT flow control latch
Locator state objects pool parent latch
Memory Management Latch
Memory Queue
Memory Queue Message Subscriber #1
Memory Queue Message Subscriber #2
Memory Queue Message Subscriber #3
Memory Queue Message Subscriber #4
Memory Queue Subscriber
MinActiveScn Latch
Mutex
Mutex Stats
OS process
QMT
SGA blob parent
SGA bucket locks
SGA heap locks
SGA pool locks
SQL memory manager workarea list latch
Shared B-Tree
Streams Generic
Testing
Token Manager
Write State Object Pool Parent Latch
XDB NFS Security Latch
XDB unused session pool
XDB used session pool
buffer pool
business card
cache buffers chains
cache buffers lru chain
cache table scan latch
cas latch
change notification client cache latch
channel handle pool latch
channel operations parent latch
checkpoint queue latch
client/application info
commit callback allocation
cp cmon/server latch
cp pool latch
cp server hash latch
cv apply list lock
cv free list lock
done queue latch
dummy allocation
enqueue hash chains
enqueues
fifth spare latch
flashback copy
gc element
gcs commit scn state
gcs partitioned table hash
gcs pcm hashed value bucket hash
gcs resource freelist
gcs resource hash
gcs resource scan list
gcs shadows freelist
ges domain table
ges enqueue table freelist
ges group table
ges process hash list
ges process parent latch
ges resource hash list
ges resource scan list
ges resource table freelist
ges value block free list
global tx hash mapping
granule operation
intra txn parallel recovery
io pool granule metadata list
job workq parent latch
k2q lock allocation
kdlx hb parent latch
kgb parent
kks stats
ksfv messages
kss move lock
ksv class latch
ksv msg queue latch
library cache load lock
lob segment dispenser latch
lob segment hash table latch
lob segment query latch
lock DBA buffer during media recovery
logical standby cache
logminer context allocation
logminer work area
longop free list parent
mapped buffers lru chain
message pool operations parent latch
msg queue latch
multiblock read objects
name-service namespace bucket
object queue header heap
object queue header operation
object stats modification
parallel query alloc buffer
parallel query stats
peshm
pesom_free_list
pesom_hash_node
pesom_heap_alloc
post/wait queue
process queue
process queue reference
recovery domain hash list
redo allocation
redo copy
resmgr:actses change group
resmgr:actses change state
resmgr:plan CPU method
resmgr:resource group CPU method
resmgr:session queuing
rm cas latch
row cache objects
second spare latch
session allocation
session idle bit
session queue latch
session switching
shared pool
shared pool sim alloc
shared pool simulator
sim partition latch
simulator hash latch
simulator lru latch
tablespace key chain
test excl. parent l0
test excl. parent2 l0
third spare latch
transaction allocation
undo global data
virtual circuit buffers
virtual circuit holder
virtual circuit queues

총 153개의 latch가 사용됨



- Test Case#2

최초 Result Cache 등록 전/후의 래치 사용량 비교


- Regist_Result.sql

        SELECT name ||','|| to_char(gets) FROM v$latch order by name ;
    -- Execute Query
        SELECT /*+ result_cache */ count(*) FROM test_rc ;
    -- After
        SELECT name ||','|| to_char(gets) FROM v$latch order by name ;
   exit;

sqlplus hr/hr @Regist_Result.sql >> Regist_Result.txt


다음은 전/후의 변화가 있는 래치 목록이다.


ASM map operation hash table
DML lock allocation
Event Group Locks
FOB s.o list latch
File State Object Pool Parent Latch
IPC stats buffer allocation latch
In memory undo latch
JS Sh mem access
JS queue access latch
JS slv state obj latch
KFC FX Hash Latch
KFC Hash Latch
KFCL LE Freelist
KFR redo allocation latch
KGNFS-NFS:SHM structure
KGNFS-NFS:SVR LIST
KJC message pool free list
KJCT flow control latch
Locator state objects pool parent latch
Memory Management Latch
Memory Queue
Memory Queue Message Subscriber #1
Memory Queue Message Subscriber #2
Memory Queue Message Subscriber #3
Memory Queue Message Subscriber #4
Memory Queue Subscriber
MinActiveScn Latch
Mutex
Mutex Stats
OS process
QMT
Result Cache: Latch
Result Cache: SO Latch
SGA blob parent
SGA bucket locks
SGA heap locks
SGA pool locks
SQL memory manager workarea list latch
Shared B-Tree
Streams Generic
Testing
Token Manager
Write State Object Pool Parent Latch
XDB NFS Security Latch
XDB unused session pool
XDB used session pool
buffer pool
business card
cache buffers chains
cache buffers lru chain
cache table scan latch
cas latch
change notification client cache latch
channel handle pool latch
channel operations parent latch
checkpoint queue latch
client/application info
commit callback allocation
cp cmon/server latch
cp pool latch
cp server hash latch
cv apply list lock
cv free list lock
done queue latch
dummy allocation
enqueue hash chains
enqueues
fifth spare latch
flashback copy
gc element
gcs commit scn state
gcs partitioned table hash
gcs pcm hashed value bucket hash
gcs resource freelist
gcs resource hash
gcs resource scan list
gcs shadows freelist
ges domain table
ges enqueue table freelist
ges group table
ges process hash list
ges process parent latch
ges resource hash list
ges resource scan list
ges resource table freelist
ges value block free list
global tx hash mapping
granule operation
intra txn parallel recovery
io pool granule metadata list
job workq parent latch
k2q lock allocation
kdlx hb parent latch
kgb parent
kks stats
ksfv messages
kss move lock
ksv class latch
ksv msg queue latch
library cache load lock
lob segment dispenser latch
lob segment hash table latch
lob segment query latch
lock DBA buffer during media recovery
logical standby cache
logminer context allocation
logminer work area
longop free list parent
mapped buffers lru chain
message pool operations parent latch
msg queue latch
multiblock read objects
name-service namespace bucket
object queue header heap
object queue header operation
object stats modification
parallel query alloc buffer
parallel query stats
peshm
pesom_free_list
pesom_hash_node
pesom_heap_alloc
post/wait queue
process queue
process queue reference
recovery domain hash list
redo allocation
redo copy
resmgr:actses change group
resmgr:actses change state
resmgr:plan CPU method
resmgr:resource group CPU method
resmgr:session queuing
rm cas latch
row cache objects
second spare latch
session allocation
session idle bit
session queue latch
session switching
shared pool
shared pool sim alloc
shared pool simulator
sim partition latch
simulator hash latch
simulator lru latch
tablespace key chain
test excl. parent l0
test excl. parent2 l0
third spare latch
transaction allocation
undo global data
virtual circuit buffers
virtual circuit holder
virtual circuit queues

155개의 래치가 사용 되었다.



- Test Case#3


등록된 Result Cache를 이용한 경우의 전/후 래치 사용량 비교



- Reuse_Result.sql

   -- Before
       SELECT name ||','|| to_char(gets) FROM v$latch order by name ;
  -- Execute Query
      SELECT /*+ result_cache */ count(*) FROM test_rc ;
  -- After
      SELECT name ||','|| to_char(gets) FROM v$latch order by name ;

exit;

sqlplus hr/hr @ Reuse_Result.sql >> Reuse_Result.txt


다음은 수행 전/후의 래치 사용량 변화가 있는 부분이다.



ASM map operation hash table
buffer pool
business card
cache buffers chains
cache buffers lru chain
cas latch
change notification client cache latch
channel handle pool latch
channel operations parent latch
checkpoint queue latch
client/application info
commit callback allocation
cp cmon/server latch
cp pool latch
cp server hash latch
cv apply list lock
cv free list lock
DML lock allocation
done queue latch
dummy allocation
enqueue hash chains
Event Group Locks
fifth spare latch
File State Object Pool Parent Latch
flashback copy
gc element
gcs commit scn state
gcs partitioned table hash
gcs pcm hashed value bucket hash
gcs resource freelist
gcs resource hash
gcs resource scan list
gcs shadows freelist
ges domain table
ges enqueue table freelist
ges group table
ges process hash list
ges process parent latch
ges resource hash list
ges resource scan list
ges resource table freelist
ges value block free list
global tx hash mapping
granule operation
In memory undo latch
intra txn parallel recovery
io pool granule metadata list
IPC stats buffer allocation latch
job workq parent latch
JS queue access latch
JS Sh mem access
JS slv state obj latch
k2q lock allocation
kdlx hb parent latch
KFC FX Hash Latch
KFC Hash Latch
KFCL LE Freelist
KFR redo allocation latch
kgb parent
KGNFS-NFS:SHM structure
KGNFS-NFS:SVR LIST
KJC message pool free list
KJCT flow control latch
kks stats
ksfv messages
kss move lock
ksv class latch
ksv msg queue latch
lob segment dispenser latch
lob segment hash table latch
lob segment query latch
Locator state objects pool parent latch
lock DBA buffer during media recovery
logical standby cache
logminer context allocation
logminer work area
longop free list parent
mapped buffers lru chain
Memory Management Latch
Memory Queue
Memory Queue Message Subscriber #1
Memory Queue Message Subscriber #2
Memory Queue Message Subscriber #3
Memory Queue Message Subscriber #4
Memory Queue Subscriber
message pool operations parent latch
MinActiveScn Latch
msg queue latch
Mutex
Mutex Stats
name-service namespace bucket
object queue header heap
object queue header operation
OS process
parallel query alloc buffer
parallel query stats
peshm
pesom_free_list
pesom_hash_node
pesom_heap_alloc
post/wait queue
process queue
process queue reference
QMT
recovery domain hash list
redo allocation
redo copy
resmgr:actses change group
resmgr:actses change state
resmgr:plan CPU method
resmgr:resource group CPU method
resmgr:session queuing
Result Cache: Latch
Result Cache: SO Latch
rm cas latch
row cache objects
second spare latch
session idle bit
session queue latch
session switching
SGA blob parent
SGA bucket locks
SGA heap locks
SGA pool locks
Shared B-Tree
shared pool
shared pool sim alloc
shared pool simulator
sim partition latch
simulator hash latch
simulator lru latch
SQL memory manager workarea list latch
Streams Generic
tablespace key chain
test excl. parent l0
test excl. parent2 l0
testing
third spare latch
Token Manager
transaction allocation
undo global data
virtual circuit buffers
virtual circuit holder
virtual circuit queues
Write State Object Pool Parent Latch
XDB NFS Security Latch
XDB unused session pool
XDB used session pool

총 148개의 래치가 사용되었다.



- 비교#1


- 일반 쿼리 수행과 Result Cache에 최초 등록 시 추가적으로 사용된 래치

   Result Cache : Latch , Result Cache : SO Latch


비교#1의 결과를 보면 일반 쿼리 수행 시와 동일한 래치들이 사용이 되지만 추가적인 Result 관련 래치가 사용이 되고 있다.

이는 SQL문 수행 결과를 메모리에 캐싱 하기 위해 추가적으로 래치가 사용되었음을 확인 할 수 있다.


- 비교#2




- 일반 쿼리 수행과 Result Cache에 등록 된 Result 사용시 변화가 있는 래치

- 추가적으로 사용된 래치

   Result Cache : Latch , Result Cache : SO Latch , Messages


Result Cache를 사용할 경우 library cache 래치의 사용유무를 확인해 보면 확인이 될 것이라는 생각에 시작했던 테스트였다. 단순  latch 사용 유,무 만 가지고서는 확인이 힘든 부분이 확인 되었다.

이 부분에 대해서는 좀더 많은 테스트를 해 보아야 할 것 같다.

단, 다시 한번 확인 한 것은 Result Cache를 사용하기 위해서는 Result Cache : Latch 를 획득 해야 한다는 사실이다.
반응형
  1. 알 수 없는 사용자 2008.02.13 08:44

    Library cache latch에 대한 요청이 없다는게 이해가 잘 안되네요? library cache latch는 Parse시에 사용되는 것인데 Result Cache와 Parse는 무관하잖아요? 좀 더 엄밀한 검증이 필요할 거 같습니다. 혹시 Cursor Cache에 의한 효과가 그렇게 나타난 것은 아닌지 검증할 필요도 있겠네요.

  2. ★깜장별★ 2008.02.15 17:52 신고

    테스트 자체가 library cache latch와 Result Cache latch가 별개로 동작하지 않을 까 하는 추측에서 시작된 테스트였는데 테스트 자체가 그걸 확인하기에는 다소 부족한 면이 있었던 것 같습니다 .

+ Recent posts