PCTFREE와 PCTUSED
대용량 DB 동영상에 나온 내용입니다
데이터로 꽉 채워진 4K짜리 A 블럭이 있다고 가정합니다
A 블럭에 기존 데이터인 주소가 null 이였는데 이를 다시 '서울시 강남구 ... '으로
UPDATE 하였습니다
그러면 A블럭은 꽉 차있으므로 주소 컬럼은 B 블럭으로 이사를 가야합니다
이처럼 Row Piece가 쪼개지는 현상을 Block Chain이라 합니다
또 전화번호가 null 이였다가 거기에 123456이라는 데이터로 UPDATE되면
C 블럭으로 Block Chain이 또 발생하게 됩니다
이처럼 하나의 Row를 읽기위해 A 블럭도 읽고 B블럭도 읽고 C블럭도 읽어야 하는 비효율이 발생합니다
위와같은 Chaining을 방지하기 위하여 오라클 7이상 부터는 주소에 UPDATE가 되면 Row 전체가 이사가는 방법을 씁니다 이게 Row Migration입니다
주소 UPDATE 후 Chaining이 발생되어 Row 전체가 이사가고 다시 전화번호가 UPDATE가 되도 B 블럭에 공간이 없다면 C블럭으로 Row 가 전체 또 이동하게 됩니다( 이 때 A블럭은 해당 Row 주소값으로 B블럭에서 C블럭으로 바뀐 값을 가지게 됩니다 )
한번의 Chaining이 발생되도 두번이상의 Chaining은 방지하겠다가 바로 Row Migration입니다
역시 마찬가지로 하나의 데이터를 읽는데 2개의 블럭을 읽어야 하는 것도
비효율입니다
그렇다면 A블럭에 400Byte 정도 Free Space를 남겨놓고 신규 데이터를 안받은 후 A블럭에 UPDATE가 일어나면 UPDATE된 데이터를 남겨진 Free Space에 쓰게 한다면 하나의 블럭을 읽고도 모든 데이터를 가지고 올 수 있습니다
이것이 PCTFREE입니다
위처럼 꽉꽉 채워놓지 말고 어느정도만 차면 더 이상 채우지 말라는 것이
PCTFREE입니다 ( Chaining이 발생하지 않죠? )
PCTFREE 10 ( 데이터 받는 공간 90%, 비워놓는 공간 10% )
데이터 받는 공간에 데이터가 다 차있을 때
레코드를 하나 지워서 A블럭에 Free Space가 89%가 되었다고 가정합시다
그러면 새로운 데이터가 들어올까요?
들어오게 하면 안됩니다~!
스토리지 매니지먼트하는 알고리즘이 너무 바빠지죠
그 경계선을 왔다갔다 하는게 얼마나 많겠습니까?
데이터 양이 일정수준 전까지 데이터가 못들어오게 막다가
일정수준에 도달하면 Free List에 등록하여 데이터를 쓸 수 있게 하겠다가
바로 PCTUSED입니다