테이블 생성시 initrans 조건에 대한 질문입니다. 0 4 4,094

by 김선호 [2008.01.04 11:23:20]


create table "test"

(

    aaa varchar2(10),

    bbb varchar2(10)

)

initrans 2

tablespace "XXXX"

 

이런식으로 테이블을 만드는데 , 여기서 initrans라는 파라미터가 어떤때 기능이 적용되는지 궁금합니다. 강좌에서 보니

'transaction수를 지정한다' 라고 되어있는데

여기서  transaction  이라는 것이 어떤의미인지 모르겠습니다.

테이블에 트랜잭션 한다는 것이 데이터를 입력, 수정, 삭제등 조작을 한다는 걸로 알고 있는데(제 생각입니다). 이 수치를 2라고 제한해 놓으면 한번에 조작이 2번식 이루어 진다? 좀 이상해서...

오라클은 row단위로 락이 걸리니 필요 없는 파라미터 일수도 있는거 같은데....

어떤역활인지 궁금합니다. 좀 도와주십쇼~

by TelL2 [2008.01.04 00:00:00]
initrans 값은 데이터 블럭에 액세스하는 DML(insert, update, delete) 문을 위해 데이터블럭 헤더에 미리 확보해 두는 transcation entry space 수 입니다. 한 블럭에 트랜젝션이 일어 날때 어느로우에 트랜젝션이 일어 나고 있다는 체크를 해 두는 필드라고 생각하시면 됩니다.
initrans 값 이상의 트랜젝션이 한 블럭에서 발생할 경우 데이터 블럭헤더가 아닌 블럭의 freespace에 할당을 하게 됩니다. 때문에 pctfree 값을 0으로 할당하지 않는 이유 중 하나가 될 수 있구요.
transaction entry space 를 확보하는데 발생하는 overhead를 줄이기 위해 미리 할당해 놓는 갯수라고 생각하시면 되겠네요.

by 김선호 [2008.01.04 00:00:00]
궁금한게 더 있는데요.
그렇다면 오라클은 row단위로 락이 걸리는게 아니고, block단위로 락이 걸린다는 말씀입니까?
그리고 dml을 수행하는데 만약 한 block에 initrans이상의 dml이 수행된다면, block의 freespace에서 이 블록이 dml수행중인지 체크하여야 하기때문에(overhead?) 느려진다. 라고 볼 수도 있는 겁니까?

by TelL2 [2008.01.04 00:00:00]
row단위 락을 위해 블럭의 헤더에 initrans에 지정된 수 만큼 공간을 미리 확보하여 이 공간에 블럭내의 어느 로우가 지금 트랜잭션 중이라고 정보를 저장하게 됩니다. 하지만 이공간이 다 사용중이라면 다음 트랜젝션이 해당 블럭에 들어왔을때 어느 로우의 트랜잭션이 발생중이라는 정보를 저장해야 하는데 공간이 없으므로 블럭내의 freespace를 찾아야 하는 오버 해드가 발생 하게 될거구요. 또 로우를 업데이트 하는 트랜젝션이 들어 온다면 해당 로우가 현재 트랜잭션 중인지 이 정보를 찾기 위해 블럭헤더 뿐만 아니라 freespace에 저장된 정보가 있다면 그 곳까지 찾아야 하는 오버해드가 발생할 수 있다는 것입니다.

by 김선호 [2008.01.04 00:00:00]
죄송하지만 하나만 더 물어보겠습니다. 테이블 생성시 initrans는 한테이블과 특정데이터(row) 대한 dml수행이 많지 않은 이상(많다는게 어느정도를 의미하는지 애매하긴하지만....) 크게 신경쓰지 않아도 된다. 이 결론에 대해 어떻게 생각하시는지...
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입