위 페이지에서 D$로 덤프떠서 확인하는 내용 관련..

원 궁금증 : USER+FREE의 값이 TOTAL과 상이하다.
확인해보니 x$segment에서 해당 phsical_ID에 할당되었다고 나오는 alloc_page_count수와,
d#memory_segment_bitmap뷰에서 해당 테이블로 count(*)를 했을때의 카운트 수가 달라서 나오는 현상.
어떤것이 정확할까?

  • USABLE_PAGE_COUNT_IN_EXTENT 의 역할이 궁금하다.
SELECT TABLE_NAME
     , TABLESPACE_ID
     , TOTAL
     , USED
     , FREE1
  FROM (
       SELECT TO_CHAR(SUM(ALLOC_PAGE_COUNT) * 8192, '999,999,999,999,990') TOTAL
         FROM X$SEGMENT
        WHERE 1=1
          AND PHYSICAL_ID = 37318970834944
     ) A, (
       SELECT TO_CHAR(COUNT(*) * 8192, '999,999,999,999,990') USED
         FROM D$MEMORY_SEGMENT_BITMAP ('TABLE,PUBLIC.T1' )
        WHERE 1=1
          AND FREENESS <> 'FR'
     ) B, (
       SELECT TO_CHAR(COUNT(*) * 8192, '999,999,999,999,990') FREE
         FROM D$MEMORY_SEGMENT_BITMAP ('TABLE,PUBLIC.T1' )
        WHERE 1=1
          AND FREENESS = 'FR'
     ) C, (
       SELECT TABLE_NAME
            , TABLESPACE_ID
         FROM DEFINITION_SCHEMA.TABLES
        WHERE 1=1
          AND PHYSICAL_ID = 37318970834944
     ) D;


ABLE_NAME TABLESPACE_ID TOTAL                USED                 FREE1               
---------- ------------- -------------------- -------------------- --------------------
T1                     2           40,370,176            9,863,168           30,294,016

위와 같이 D$MEMORY_SEGMENT_BITMAP 로 볼수 있지만 고객이 D$로 보면 안됩니다. 저도 기억이 안났음.
실제 고객한테는 어차피 Alloc Page로 할당 된 것이고 이를 보면 되고 실제 Usage는 정확히 보기 힘들다
보면 볼수도 있겠지만 위의 뷰는 잘못 건드리면 DB 자체에 문제가 생길 수도 있기에 오픈 하지 않고
있다 정 원하면 볼수 도 있겠지만 실제 data건수대비 레코드 비율로 보았으면 한다. 식으로 대응 하면
될 것으로 보입니다.
--> 정확히 하면 요것도 page 단위로 보여주는 것이어서 레코드 건수와 완전히 동일하다고 볼수는 없지만 우리는 참고 정도로만 사용.


* 둘 중 뭘 믿어야할까?
gSQL> select count(*) from D$MEMORY_SEGMENT_BITMAP ('TABLE,HENI.ACCT_BALANCE' );
# COUNT(*)
  8192

1 row selected.

gSQL> select ALLOC_PAGE_COUNT from X$SEGMENT@LOCAL where PHYSICAL_ID = 36215164239872;
# ALLOC_PAGE_COUNT
  8224

1 row selected.

  • 첫번째로 드는 생각은 테이블 해더때문이 아닐까? 데이터가 없는 빈 테이블을 만들어서 비교해보자.
  • 테이블 생성시부터 차이나는건 맞지만, 해더때문은 아닌듯... SELECT count(*) from D$MEMORY_SEGMENT_BITMAP_HEADER ('TABLE,HENI.T10' );
gSQL> create table T10 (i1 int);
Table created.

gSQL> select PHYSICAL_ID from definition_schema.tables where table_name = 'T10';
# PHYSICAL_ID
36202279337984
1 row selected.

gSQL> select count(*) from D$MEMORY_SEGMENT_BITMAP ('TABLE,HENI.T10' );
# COUNT(*)
    32
1 row selected.

gSQL> select ALLOC_PAGE_COUNT from X$SEGMENT@LOCAL where PHYSICAL_ID = 36202279337984;
# ALLOC_PAGE_COUNT
            64
1 row selected.

테이블 생성 초기 세팅값과 관련있을까..?
PCTFREE , PCTUSED, STORAGE INITIAL, NEXT, MINSIZE 바꿨지만 변함없음..
CREATE TABLE "HENI"."T20"
    (
        "I1" NUMBER( 10, 0 )
      , "I2" NUMBER( 10, 0 )
    )
    PCTFREE  50
    PCTUSED  20
    INITRANS 4
    MAXTRANS 8
    STORAGE
    (
        INITIAL 262144
        NEXT    262144
        MINSIZE 262144
        MAXSIZE 562949953159168
    )
    TABLESPACE "MEM_DATA_TBS"
;
gSQL> \\\\

Table created.

gSQL> commit;

Commit complete.

gSQL>
gSQL>
gSQL>
gSQL> select count(*) from D$MEMORY_SEGMENT_BITMAP ('TABLE,HENI.T20' );

                COUNT(*) # 32


1 row selected.

gSQL> select PHYSICAL_ID from definition_schema.tables where table_name = 'T20';

             PHYSICAL_ID # 80805514706944


1 row selected.

gSQL> select ALLOC_PAGE_COUNT from X$SEGMENT@LOCAL where PHYSICAL_ID = 80805514706944;

        ALLOC_PAGE_COUNT # 64


1 row selected.

음..... 아래 뷰에서 USABLE_PAGE_COUNT_IN_EXTENT 이것과 관련이 있을 것 같은데....
gSQL> select * from X$SEGMENT@LOCAL where PHYSICAL_ID = 80814104641536;

            SEGMENT_TYPE # MEMORY_BITMAP
                  TBS_ID # 2
             PHYSICAL_ID # 80814104641536
        ALLOC_PAGE_COUNT # 64
     HAS_RELATION_HEADER # TRUE
  INIT_RELATION_COMPLETE # TRUE
                  USABLE # TRUE
              IS_OFFLINE # FALSE
                   STATE # ALLOC_BODY
              GLOBAL_SCN # 0.0.0
              OBJECT_SEQ # 1
USABLE_PAGE_COUNT_IN_EXTENT # 32
         INITIAL_EXTENTS # 2
            NEXT_EXTENTS # 1
             MIN_EXTENTS # 2
             MAX_EXTENTS # 2147483647
      PARENT_PHYSICAL_ID # 80814104641536

위 USABLE_PAGE_COUNT_IN_EXTENT 값은 테이블스페이스의 EXTENT 사이즈와 관련있음.
테이블스페이스의 extent size를 기본값 32개블럭이 아닌, 64개 블록으로 생성
gSQL> CREATE MEMORY DATA TABLESPACE "HENI_TBS1"
    DATAFILE
        '/home/sunje/workspace/product/Gliese/home/db/heni_tbs1.dbf'
        SIZE 209715200 REUSE
    ONLINE
    LOGGING
    EXTSIZE 524288;   

                TBS_NAME # HENI_TBS1
                  TBS_ID # 4
                TBS_ATTR # MEMORY | PERSISTENT | DATA
              IS_LOGGING # TRUE
               IS_ONLINE # TRUE
           OFFLINE_STATE # null
             EXTENT_SIZE # 524288
               PAGE_SIZE # 8192

초기 할당되는 블록수가 다름은 물론인데, 
USABLE_PAGE_COUNT_IN_EXTENT 크기도 이 익스턴트블록수와 같음.. 이 값만큼 차이가 난다.
gSQL> create table h1 (i1 int) tablespace HENI_TBS1;

Table created.

gSQL> commit;

Commit complete.


gSQL> select count(*) from D$MEMORY_SEGMENT_BITMAP ('TABLE,HENI.H1' );

COUNT(*)
--------
      64

1 row selected.

gSQL> select PHYSICAL_ID from definition_schema.tables where table_name = 'H1';

   PHYSICAL_ID
--------------
80822694576128

1 row selected.

gSQL> select ALLOC_PAGE_COUNT from X$SEGMENT@LOCAL where PHYSICAL_ID = 80822694576128;

ALLOC_PAGE_COUNT
----------------
             128

1 row selected.

gSQL> set vertical on
gSQL> select * from X$SEGMENT@LOCAL where PHYSICAL_ID = 80822694576128;

            SEGMENT_TYPE # MEMORY_BITMAP
                  TBS_ID # 4
             PHYSICAL_ID # 80822694576128
        ALLOC_PAGE_COUNT # 128
     HAS_RELATION_HEADER # TRUE
  INIT_RELATION_COMPLETE # TRUE
                  USABLE # TRUE
              IS_OFFLINE # FALSE
                   STATE # ALLOC_BODY
              GLOBAL_SCN # 0.0.0
              OBJECT_SEQ # 1
USABLE_PAGE_COUNT_IN_EXTENT # 64
         INITIAL_EXTENTS # 2
            NEXT_EXTENTS # 1
             MIN_EXTENTS # 2
             MAX_EXTENTS # 2147483647
      PARENT_PHYSICAL_ID # 80822694576128

1 row selected.


+ Recent posts