오라클 데이터블록 질문입니다. 0 2 569

by njnj [Oracle 기초] 블록사이즈 [2020.08.12 17:12:59]


create table btable(
    var     varchar2(10),
    num     number,
    data    date,
    ch    char(10));

insert into btable values ('abcdefghij', 1, sysdate, 'A');

 

위와 같이 테이블 생성 후 데이터를 입력했을때

로우당 29byte가 나왔는데 데이터블록당 8kbyte로 알고있는데 계산해 봤을때 한 블록당 282로우를 넣을 수 있을거 같은데 들어가지가 않는것 같네요...

1. 한블록에 282로우를 전부 넣을수 있나요?

2. 변경되는 블록 조회하는 방법이 따로 있나요?

by pajama [2020.08.12 21:05:08]

블록 구조에 대한 내용을 찾아보면 header나 dictionary 정보가 담겨있어서 블럭 전체를 온전히 데이터 저장하는데 사용하지는 않는 것 같네요.

https://docs.oracle.com/cd/E11882_01/server.112/e40540/logical.htm#CNCPT1046

질문하신 글의 테이블로 테스트 했을때 제 경우는 한 블럭에 191개 ROW가 들어갔네요. 물론 PCTFREE같은 값에 의해 달라질 수 있을 것 같습니다. 테스트한 내용 중에 제가 잘못된 이해하는 부분이 있다면 지적 부탁드립니다.

 

SQL> create table btable(var varchar2(10),num number,data date,ch char(10));

Table created.

-- 동일한 데이터 282건 입력
SQL> insert into btable select 'abcdefghij', 1, sysdate, 'A' from dual connect by level <=282;

282 rows created.

-- row size 계산
SQL> select distinct vsize(var)+vsize(num)+vsize(data)+vsize(ch) rowsize from btable;

   ROWSIZE
----------
        29

-- dbms_rowid 패키지를 사용해서 block별 rowid 개수 확인
SQL> select dbms_rowid.rowid_block_number(rowid), count(*) from btable group by dbms_rowid.rowid_block_number(rowid);

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)   COUNT(*)
------------------------------------ ----------
                               26661         91
                               26660        191

 


by njnj [2020.08.13 09:14:58]

감사합니다. 덕분에 잘 이해했습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입