새로쓴 대용량 데이터베이스솔루션 1 (2008년)
테이블과 인덱스의 분리형 0 0 5,977

by 구루비 ROWID 클러스터링 팩터 clustering factor [2009.04.30]


1.1. 테이블과 인덱스의 분리형

  • 인덱스와 독립적일 수 있다는 것은 저장 시 부담이 매우 가벼워진다는 점에서 의미있는 장점을 가지게 된다.
  • 테이블과 인덱스가 별도로 분리되어 있는 구조는 관계형 데이터베이스의 가장 일반적인 데이터저장방식이다.
  • 분리형 테이블의 구조가 가지는 최대의 특징은 '임의의 위치'에 저장된다는 점

1.1.1 분리형 테이블의 구조

로우가 한 조각으로 존재하기 위해서는 로우의 길이가 변화(보통 증가)할 때마다 연결된 상태로 들어갈 수 있는 빈 공간을 찾아 옮겨다닐 수 밖에 없다
로우의 길이가 너무 많이 커져 로우의 길이가 늘어날때 사용할 여유공간이 부족하게 되었다면 다른 블록을 사용 할 수 밖에 없다.
이때 방식이 로우마이그래이션과 체인이다

  • ROWID의 구성

AAAHZ0AALAAAAAiAAA

표시는 18byte 실제크기는 10byte
6 자리 : 데이터오브젝트번호 = DB Segment 식별정보(해당 로우가 속해있는 오브젝트번호)
3 자리: Relative file = tablespace의 상대적 datafile번호(해당 로우가 속해있는 데이터파일번호)
6 자리: Block number = Row를 포함하는 DataBlock번호(해당 로우가 속해있는 데이터파일의 데이터 블록주소값)
3 자리: Row number = Block에서의 Row의 Slot : 데이터 블록 내에서 해당 로우의 주소값

ROWID는 테이블에 존재하는것이 아니라 인덱스에 존재한다.
ROWID에는 로우의 구체적인 위치정보가 들어있는 것이 아니라 방(슬록)번호가 있다. 이 슬롯번호속에 로우의 위치 전보가 들어 있다
이것은 블록내의 로우의 위치가 이동하더라도 ROWID는 결코 변하지 않고 슬롯번호가 변한다.

  • 응축(Condensing)
    블럭 내에 저장될 로우가 한조각(one piece)이 되도록 하기 위한 공간이 있음에도 불구하고 끊어지지 않고 들어갈 수 있는 이어진 공간이 없다면 블록 전체의 데이터위치를 재배치하는 작업이 진행됨 이를 일컬어 'Condensing'이라고 함
  • RowMigration
    로우가 한 조각으로 존재하기 위해서는 로우의 길이가 변화(보통 증가)할 때마다 연결된 상태로 들어갈 수 있는 빈 공간을 찾아 옮겨다닐 수 밖에 없다
    이때 해당 블럭내에 로우 전체가 들어갈 수 없다면 ROWID는 그대로 인 상태로 다른 블록으로 이동할 수 있다 이것을 'RowMigration'이라고 한다
  • Chain
    로우마이그래이션과는 다르게 한 로우의 크기가 한 블럭의 크기보다 커서 여러개의 블럭에 걸쳐 저정되는 것을 말한다

1.1.2 클러스터링 팩터(clustering factor)

분리형 테이블의 특징인 '임의의 위치'에 저장으로 인해 원하는 값을 찾기위해 필연적으로 여러 블럭을 찾아 보아야 한다
이미 액세스해 두었던 블록에서 원하는 로우를 찾을 확률이 높다면 물리적으로 액세스할 블럭의 량은 분명히 줄어들 것이다.
임의의 위치에 흩어져 있더라도 얼마나 주변에 모여 있느냐에 따라 액세스 효율은 커다란 영향을 받게 된다.

인덱스의 컬럼값으로 정렬되어 있는 인덱스 로우의 순서와 테이블에 저장되어 있는 데이터 로우의 위치가 얼마나 비슷한 순서로 저장되어 있는지의 정도를 나타낸 것을 '클러스터링 팩터'라고 표현한다

1.1.3 분리형 테이블의 액세스 영향요소

  • 넓은 범위의 액세스처리에 대한 대처방안
    클러스터링 팩터를 높이기 위해서 제멋대로 흩어진 데이터를 정돈된것처럼 재생성할 수 있다.
    ( 단 모든 액세스형태에서 효율을 얻을 수 는 없다.)
    인덱스를 전략적으로 구성하고 SQL을 실행계획을 최적화시키는 방법이 중요하다
  • 클러스터링 팩터 향상을 위한 고려사항
    클러스터링 팩터의 향상을 위해 테이블을 재생성한다면 가장 자주 범위처리하는 컬럼으로 정렬하여 저장
    테이블에 데이터를 저장할 때 관련된 인덱스를 모두 제거하거나 비활성 시키는 것이 좋다
    인덱스를 생성한 채로 대량의 데이터를 저장한면 저장속도 저하 및 인덱스 분할에 따른 인덱스저장 밀도가 매우 나빠진다.

문서에 대하여

  • 최초작성자 : VLDB:장세정
  • 최초작성일 : 2008년 2월 14일
  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • 이 문서의 내용은 이화식님의 새로쓴 대용량 데이터베이스 솔루션을 참고했습니다.
  • 이 문서를 다른 블로그나 홈페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^\^
"구루비 데이터베이스 스터디모임" 에서 2008년에 "새로쓴 대용량 데이터베이스 솔루션1" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/2555

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

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