위 페이지에서 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.
'IT Engineer > Database' 카테고리의 다른 글
SHARED_SESSION, gserver, balancer, gdispatcher (0) | 2019.02.15 |
---|---|
coordinator 위치에 따른 성능테스트 (0) | 2019.02.13 |
coordinator 위치에 따른 성능테스트 결과메모 (0) | 2019.02.13 |
database cluster 개념 (1) | 2019.02.13 |
Shared Nothing Disk (0) | 2019.02.13 |