태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

LOB 데이터와 Cache 속성 - 두번째 이야기

오라클 2008.08.13 11:34
2008/05/15 - [Advanced Oracle] - LOB 데이터와 Cache 속성에서 LOB과 CACHE 속성의 연관 관계에 대해서 간단한 Test 결과를 공유한 바 있다.

해당 글에 대해 다음과 같은 Comment가 달렸다.

in-line lob의 경우 buffer cache를 경유하며 이 때는 cache 옵션을 사용한 것 처럼 작동한다. 그러나 실제 nocache로 선언한 경우 nologging을 같이 선언 할 수 있는데 cache 옵션을 명시적으로 사용하면무조건 logging 이다. 그렇다면 위와 같이 in-line lob를 nocache로 선언하고 nologging으로 사용한다면 redo가 사용 될것인가?

nologging을 선언한 경우에는 Redo 생성이 최소화될 것이고, 그렇지 않은 경우에는 Redo가 생성될 것이다(Document에 의하면). 하지만 역시 Test를 해보지 않으면 정확한 결과를 공유하기 힘들겠다. 아래에 간단한 Test Case가 있다.

두 가지의 경우를 비교하고자 한다.
LOB Data의 크기가 4K 미만이면 별도의 Segment가 아닌 Table Segment의 Block에 저장된다. 반면 LOB Data의 크기가 4K 이상이면 별도의 LOB Segment에 저장될 것이다. 이 두가지 경우에 Redo 생성이 어떻게 다르게 나타나는지를 비교해 보자.

Case1: LOB Data의 크기가 4K 미만인 경우

@mysid
@mon_on &v_sid

drop table t1 purge;
create table t1(c1 clob)
  lob(c1) store as (nocache nologging) -- nologging
;
 

begin
  
  for idx in 1 .. 100000 loop
    insert into t1 values('0123456789'); -- < 4K
  end loop;
  
  commit;
  
end;
/

@mon_off

drop table t1 purge;
create table t1(c1 clob)
  lob(c1) store as (nocache logging) -- logging
;

begin
  
  for idx in 1 .. 100000 loop
    insert into t1 values('0123456789');  -- <4K
  end loop;
  
  commit;
  
end;
/

@mon_off2

@mon_show2
4K 미만의 LOB Data에 대한 nologging과 logging의 비교 결과는 다음과 같다.
NAME                                           VALUE1       VALUE2         DIFF
---------------------------------------- ------------ ------------ ------------
physical write total bytes                          0   10,641,408   10,641,408
session pga memory                            720,896    4,587,520    3,866,624
session pga memory max                        720,896    4,587,520    3,866,624
session uga memory                            458,248            0     -458,248
physical read total bytes                      32,768      458,752      425,984
session uga memory max                        458,248      261,964     -196,284
physical read bytes                            32,768      131,072       98,304
redo size                                  29,344,080   29,341,896       -2,184
...

STAT_NAME                                      VALUE1       VALUE2         DIFF
---------------------------------------- ------------ ------------ ------------
sql execute elapsed time                    5,255,255    5,970,572      715,317
DB time                                     5,370,640    6,049,237      678,597
DB CPU                                      4,471,217    4,407,326      -63,891
PL/SQL execution elapsed time                 335,458      325,010      -10,448
sequence load elapsed time                     44,833       39,366       -5,467
...
Redo Size에 아무런 차이가 없다. 즉, Logging 속성에 무관하게 거의 동일한 양의 Redo가 생성된다. 당연한 결과라고 할 수 있다. Data Block에 LOB이 저장되므로 Redo가 무조건 생성되는 것이다.

Case2: LOB Data의 크기가 4K 이상인 경우

@mysid
@mon_on &v_sid

drop table t1 purge;
create table t1(c1 clob)
  lob(c1) store as (nocache nologging)  -- nologging
;
 
declare
  v_value varchar2(10000);
begin
  for idx in 1 .. 10000 loop
    v_value := v_value || '0';   -- > 4K
  end loop;
  
  for idx in 1 .. 1000 loop
    insert into t1 values(v_value);
  end loop;
  
  commit;
  
end;
/

@mon_off

drop table t1 purge;
create table t1(c1 clob)
  lob(c1) store as (nocache logging)  -- logging
;

declare
  v_value varchar2(10000);
begin
  for idx in 1 .. 10000 loop
    v_value := v_value || '0';
  end loop;
  
  for idx in 1 .. 1000 loop
    insert into t1 values(v_value);  -- > 4K
  end loop;
  
  commit;
  
end;
/

@mon_off2

@mon_show2
4K 이상의 LOB Data에 대한 nologging과 logging의 비교 결과는 다음과 같다.
NAME                                           VALUE1       VALUE2         DIFF
---------------------------------------- ------------ ------------ ------------
redo size                                   1,169,916   25,720,496   24,550,580
session pga memory                            983,040            0     -983,040
session pga memory max                        983,040      262,144     -720,896
session uga memory                            458,248            0     -458,248
session uga memory max                        458,248      254,380     -203,868
physical read bytes                            81,920       32,768      -49,152
physical read total bytes                      81,920       32,768      -49,152
...

STAT_NAME                                      VALUE1       VALUE2         DIFF
---------------------------------------- ------------ ------------ ------------
DB time                                     3,790,992    8,103,137    4,312,145
sql execute elapsed time                    3,699,938    7,998,178    4,298,240
DB CPU                                        795,460    1,065,060      269,600
PL/SQL execution elapsed time                  10,288       11,340        1,052
parse time elapsed                             19,039       19,841          802
...
Nologging 속성이 부여된 경우에는 Redo가 생성되지 않는다. 하지만 logging 속성이 부여된 경우에는 Redo가 생성된다. 그만큼 수행 시간(DB Time)또한 크게 개선된다. 이것 역시 당연한 결과라고 할 수 있겠다.

LOB을 사용하는 경우 큰 크기의 Data가 대부분일것(더 정확하게 말하면 별도의 Segment에 저장)이므로 Case2가 우리가 실제로 많이 접하는 경우가 될 것이다.

신고
tags : , ,
Trackback 0 : Comment 1
  1. lee 2008.08.13 18:48 신고 Modify/Delete Reply

    정말 좋은 설명 감사합니다.

Write a comment

티스토리 툴바