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. 변경되는 블록 조회하는 방법이 따로 있나요?
블록 구조에 대한 내용을 찾아보면 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