DB 버전 : Oracle Database 11.2.0.1
요약 :
테이블에 commit 되지 않은 데이터가 있고 다른 세션에서 해당 테이블 조회 시 commit 되지 않은 데이터를 읽어 올까?
- INSERT 만 발생시키고 uncommit 상태에서 다른 세션을 통한 데이터 조회 시 uncommit block 조회 하는 것 확인 됨
RAC 환경에서 commit 되지 않은 데이터를 가진 테이블을 다른 노드에서 조회 시 어떻게 동작 할까?
- RAC 환경에서 LMS 프로세스가 uncommit block 다른 노드로 전달 해줌
- 다른 노드에서 두번째 조회 시 buffers 가 올라 가는 것으로 봐서 최초 조회 시 local undo 에 저장 후 재 조회 시 사용 하는 것으로 보임
LMS(Global cache service background process) LMS 는 RAC 노드들 사이에서 데이터 블럭들을 전송해 주는 역할을 한다. 이 백그라운드 프로세스의 일반적인 logical read 부하는 초당 100 블럭을 넘지 않는다. 초당 수십만 블럭을 액세스 하면 무언가 잘못된 것이고 시스템은 버티기 어려워 진다. |
insert 수행 uncommit 상태에서 데이터 조회 시 uncommit block 조회 테스트
## session 1
SQL> create table t1 (c1 varchar(10), c2 varchar(10)) ;
SQL> insert into t1 values(1,'a');
SQL> insert into t1 values(2,'a');
SQL> commit ;
SQL> select * from t1 ;
C1 C2
------------------------------ ------------------------------
1 a
2 a
SQL> ALTER SESSION SET STATISTICS_LEVEL = ALL ;
Session altered.
SQL> select * from t1 ;
SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ADVANCED ALLSTATS COST LAST'));
C1 C2
------------------------------ ------------------------------
1 a
2 a
SQL> SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ADVANCED ALLSTATS COST LAST'));
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 2 (100)| | 2 |00:00:00.01 | 4 |
| 1 | TABLE ACCESS FULL| T1 | 1 | 2 | 28 | 2 (0)| 00:00:01 | 2 |00:00:00.01 | 4 |
--------------------------------------------------------------------------------------------------------------------
## session 2
SQL> insert into t1 select level, 'a' from dual connect by level <= 2000000 ;
2000000 rows created.
-- commit 안함
## session 1
SQL> select * from t1 ;
C1 C2
------------------------------ ------------------------------
1 a
2 a
-- uncommit 블록까지 조회 함
SQL> SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ADVANCED ALLSTATS COST LAST'));
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 2 (100)| | 2 |00:00:00.26 | 19780 |
| 1 | TABLE ACCESS FULL| T1 | 1 | 2 | 28 | 2 (0)| 00:00:01 | 2 |00:00:00.26 | 19780 |
--------------------------------------------------------------------------------------------------------------------
반응형
RAC 환경 다른 노드에서 데이터 조회시 LMS 프로세스 stat 변화
-- rac1 lms 프로세스 stat
select *
from v$sesstat a, v$statname b
where a.STATISTIC# = b.STATISTIC#
and sid = 131
and b.name like '%read%'
and b.name in (
'session logical reads'
,'data blocks consistent reads - undo records applied'
,'no work - consistent read gets'
,'cleanouts and rollbacks - consistent read gets'
)
;
SID STATISTIC# VALUE STATISTIC# NAME CLASS STAT_ID
---------- ---------- ---------- ---------- ---------------------------------------------------------------------- ---------- ----------
131 11 59283 11 session logical reads 1 3143187968
131 264 26776 264 data blocks consistent reads - undo records applied 128 2915445793
131 265 13596 265 no work - consistent read gets 128 2814375799
131 268 8965 268 cleanouts and rollbacks - consistent read gets 128 1083903169
## rac2 session 에서 select
SQL> select * from t1 ;
C1 C2
------------------------------ ------------------------------
1 a
2 a
-- 1번 에서 조회보다 적은 buffer read, lms 프로세스로 부터 undo 데이터를 받아 그런 것
SQL> SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ADVANCED ALLSTATS COST LAST'));
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 1081 (100)| | 2 |00:00:00.80 | 4895 |
| 1 | TABLE ACCESS FULL| T1 | 1 | 1 | 14 | 1081 (1)| 00:00:13 | 2 |00:00:00.80 | 4895 |
--------------------------------------------------------------------------------------------------------------------
-- rac1 lms 프로세스 stat 변화량, 1번 노드의 언두 데이터를 조회해서 2번 노드로 보내 줌
SQL> /
SID STATISTIC# VALUE STATISTIC# NAME CLASS STAT_ID
---------- ---------- ---------- ---------- ---------------------------------------------------------------------- ---------- ----------
131 11 79194 11 session logical reads 1 3143187968
131 264 38588 264 data blocks consistent reads - undo records applied 128 2915445793
131 265 13656 265 no work - consistent read gets 128 2814375799
131 268 12943 268 cleanouts and rollbacks - consistent read gets 128 1083903169
## rac2 session 에서 두번째 select
-- buffer read 가 1번 노드와 같아지고 disk read 가 있음, local undo 에 저장해서 읽어 오는 듯
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 1081 (100)| | 2 |00:00:01.64 | 19780 | 3185 |
| 1 | TABLE ACCESS FULL| T1 | 1 | 1 | 14 | 1081 (1)| 00:00:13 | 2 |00:00:01.64 | 19780 | 3185 |
-----------------------------------------------------------------------------------------------------------------------------
참고
https://engineering-skcc.github.io/oracle%20tuning/LMS%EA%B0%80-%ED%8A%84%EB%8B%A4/
'DBMS > ORACLE' 카테고리의 다른 글
테이블 OWNER가 아닌 다른 유저로 인덱스 생성 시 필요 권한 (0) | 2022.02.28 |
---|---|
APPEND 사용 시 logging / nologging 에 따른 로그 사용량 변화 (0) | 2022.02.27 |
oracle index 사이즈 증가 테스트 (0) | 2022.02.16 |
ORA-1653 테이블스페이스 여유 공간 있는데 INSERT 실패 (0) | 2022.02.16 |
ORACLE EOS 확인 (0) | 2022.02.16 |
댓글