[18] 블록 마스터 해싱과 관련된 _lm_contiguous_res_count 파라미터 동작 방식 확인

이번 시간에는 블록 마스터 해싱과 관련된 내용을 살펴보도록 하겠습니다. 일반적으로 오라클은 연속된 블록 단위로 동일한 마스터 노드를 할당하며, 연속된 블록의 단위는 _lm_contiguous_res_count 파라미터 설정 값에 따라 결정된다고 알려져 있습니다. 테스트를 통해 확인해보도록 하겠습니다.

1) _lm_contiguous_res_count 파라미터 설정값 확인


SYS @ OOW1 > @get_param _lm_contigu

NAME                       VALUE      DEFLT      DESCRIPTION
-------------------------- ---------- ---------- --------------------------------------------------
_lm_contiguous_res_count   128        TRUE       number of contiguous blocks that will hash to the
                                                 same HV bucket

Note
파라미터 설정 값은 128임을 확인했습니다

2) 테스트용 테이블스페이스 생성


테스트 결과를 쉽게 확인하기 위해서 테이블 및 인덱스 별로 별도의 테이블스페이스를 생성합니다.

create tablespace TEST_TS    datafile '+DATA' size 500m;
create tablespace TEST_IDX01 datafile '+DATA' size 500m;

 

3) 테스트용 테이블 생성


테스트의 편의성을 위해서 블록 당 1개의 레코드만 저장되도록 합니다. 그리고 Dynamic Sampling으로 인한 GC 통신 발생 현상을 제거하기 위해서 T1 테이블에 통계 정보를 생성합니다.

SCOTT @ OOW1 > create table t1 (c1 number, c2 char(2000), dummy char(2000)) pctfree 90 tablespace test_ts;
SCOTT @ OOW1 > insert into t1 select level, level, level from dual connect by level <= 2000; SCOTT @ OOW1 > commit;

SCOTT @ OOW1 > exec dbms_stats.gather_table_stats(user,'T1');
SCOTT @ OOW1 > select count(*) row_cnt,
       count(distinct dbms_rowid.rowid_block_number(rowid)) blk_cnt,
       min(dbms_rowid.rowid_block_number(rowid)) min_dba,
       max(dbms_rowid.rowid_block_number(rowid)) max_dba
       from   t1;

   ROW_CNT    BLK_CNT    MIN_DBA    MAX_DBA
---------- ---------- ---------- ----------
      2000       2000        131       2175

 

4) 테이블 블록 마스터 노드 확인


블록 마스터 노드를 확인하는 스크립트는 내부적으로 GX$ 뷰를 이용합니다. GX$ 뷰를 생성하는 방법은 “여기“를 참고하시기 바랍니다.

SCOTT @ OOW1 > @fnd_obj_master T1

    INST      CLASS KJBRNAME                       KJBLNAME2       KJBRGRANT KJBRMASTER
    ---- ---------- ------------------------------ --------------- --------- ----------
   1 OOW3          8 [0x80][0x8],[BL][ext 0x0,0x0]  128,8,BL       KJUSEREX           2
   2 OOW3          9 [0x81][0x8],[BL][ext 0x0,0x0]  129,8,BL       KJUSEREX           2
   3 OOW3          4 [0x82][0x8],[BL][ext 0x0,0x0]  130,8,BL       KJUSEREX           2
... 생략

 128 OOW3          1 [0xff][0x8],[BL][ext 0x0,0x0]  255,8,BL       KJUSEREX           2
---------------------------------------------------------------------------------------
 129 OOW1          8 [0x100][0x8],[BL][ext 0x0,0x0] 256,8,BL       KJUSEREX           0
 130 OOW1          8 [0x101][0x8],[BL][ext 0x0,0x0] 257,8,BL       KJUSEREX           0
 131 OOW1          1 [0x102][0x8],[BL][ext 0x0,0x0] 258,8,BL       KJUSEREX           0
... 생략

 256 OOW1          1 [0x17f][0x8],[BL][ext 0x0,0x0] 383,8,BL       KJUSEREX           0
---------------------------------------------------------------------------------------
 257 OOW2          8 [0x180][0x8],[BL][ext 0x0,0x0] 384,8,BL       KJUSEREX           1
 258 OOW2          8 [0x181][0x8],[BL][ext 0x0,0x0] 385,8,BL       KJUSEREX           1
 259 OOW2          1 [0x182][0x8],[BL][ext 0x0,0x0] 386,8,BL       KJUSEREX           1
... 생략

 384 OOW2          1 [0x1ff][0x8],[BL][ext 0x0,0x0] 511,8,BL       KJUSEREX           1
---------------------------------------------------------------------------------------
 385 OOW3          8 [0x200][0x8],[BL][ext 0x0,0x0] 512,8,BL       KJUSEREX           2
 386 OOW3          8 [0x201][0x8],[BL][ext 0x0,0x0] 513,8,BL       KJUSEREX           2
 387 OOW3          1 [0x202][0x8],[BL][ext 0x0,0x0] 514,8,BL       KJUSEREX           2
... 생략

결과분석
위의 결과에서 보는 것과 같이 _lm_contiguous_res_count 파라미터의 설정 값인 128개 단위로 마스터 노드를 할당하는 것을 알 수 있습니다. 다만, 예상했던 것과는 달리 1->2->3->1-2->3.. 식의 순차적인 할당 방식은 아닙니다 (2->0->1->2->1->0->2->0->1->2.. 식으로 마스터 노드를 할당)

5) 인덱스 블록 마스터 노드 확인


인덱스도 테이블과 동일한 방식으로 마스터 노드를 할당하는지여부를 확인합니다. 버퍼 캐시가 작은 환경에서는 스크립트 수행 전에 인덱스를 full scan하는 SQL을 수행해서 인덱스 블록들을 버퍼 캐시로 로딩하는 것이 좋습니다.

SCOTT @ OOW1 > create index t1_idx01 on t1 (c1, c2) tablespace test_idx01 nologging;
SCOTT @ OOW1 > select /*+ index (t1 t1_idx01) */ count(*) from t1 where c1>0;

  COUNT(*)
----------
      2000

SCOTT @ OOW1 > @fnd_obj_master T1_IDX01

    INST      CLASS KJBRNAME                       KJBLNAME2       KJBRGRANT KJBRMASTER
    ---- ---------- ------------------------------ --------------- --------- ----------
  1 OOW1          8 [0x80][0x9],[BL][ext 0x0,0x0]  128,9,BL        KJUSEREX           0
  2 OOW1          9 [0x81][0x9],[BL][ext 0x0,0x0]  129,9,BL        KJUSEREX           0
  3 OOW1          4 [0x82][0x9],[BL][ext 0x0,0x0]  130,9,BL        KJUSEREX           0
... 생략

128 OOW1          1 [0xff][0x9],[BL][ext 0x0,0x0]  255,9,BL        KJUSERPR           0
---------------------------------------------------------------------------------------
129 OOW2          8 [0x100][0x9],[BL][ext 0x0,0x0] 256,9,BL        KJUSEREX           1
130 OOW2          8 [0x101][0x9],[BL][ext 0x0,0x0] 257,9,BL        KJUSEREX           1
131 OOW2          1 [0x102][0x9],[BL][ext 0x0,0x0] 258,9,BL        KJUSERPR           1
... 생략

256 OOW2          1 [0x17f][0x9],[BL][ext 0x0,0x0] 383,9,BL        KJUSERPR           1
---------------------------------------------------------------------------------------
257 OOW3          8 [0x180][0x9],[BL][ext 0x0,0x0] 384,9,BL        KJUSEREX           2
258 OOW3          8 [0x181][0x9],[BL][ext 0x0,0x0] 385,9,BL        KJUSEREX           2
259 OOW3          1 [0x182][0x9],[BL][ext 0x0,0x0] 386,9,BL        KJUSERPR           2
... 생략

384 OOW3          1 [0x1ff][0x9],[BL][ext 0x0,0x0] 511,9,BL        KJUSERPR           2
--------------------------------------------------------------------------------------------------------
385 OOW2          8 [0x200][0x9],[BL][ext 0x0,0x0] 512,9,BL        KJUSEREX           1
386 OOW2          8 [0x201][0x9],[BL][ext 0x0,0x0] 513,9,BL        KJUSEREX           1
387 OOW2          1 [0x202][0x9],[BL][ext 0x0,0x0] 514,9,BL        KJUSERPR           1
388 OOW2          1 [0x203][0x9],[BL][ext 0x0,0x0] 515,9,BL        KJUSERPR           1
... 생략

결과분석
인덱스 역시 테이블과 동일한 방식으로 마스터 노드를 할당하는 것을 확인할 수 있습니다. 약간의 차이는 첫번째 마스터 노드가 0(OOW1)으로 시작한다는 것이며 그 이후의 마스터 노드 순서는 테이블과 동일합니다. 이 차이점은 오브젝트 번호의 차이로 보면 될 것 같습니다.

그렇다면, 이와 같이 마스터 노드가 여러 노드로 분산되는 것이 성능 상이 문제를 유발할 수 있을까요?
해당 내용은 다음 포스팅에서 진행합니다.

[19] 블록 마스터 노드 분산에 따른 gc cr grant 2-way 문제 가능성 및 해결 방안 바로가기

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s