1.1 테이블과 인덱스의 분리

1.1 테이블과 인덱스의 분리

테이블과 인덱스가 분리되어 있는것은 관계형 DB의 일반적인 형태이다.
과거엔 키와 데이터가 붙어있었다면 현재는 키를 통해 데이터를 한번 더 찾아가야한다.

1.1.1 분리형 테이블의 구조 7p

활용가능한 블록을 Free List에 기록했다가 데이터를 저장할 때 제공한다.
로우가 끊어지게 될 경우 Free Space를 활용하여 재배치를 하도록 한다.

테이블스페이스 : 논리적인 저장공간을 의미하며 이는 물리적인 데이터 파일로 구성된다.
세그먼트 : 테이블 스페이스를 용도별로 나눈것
오브젝트 : 세그먼트에 들어올 수 있는것.
단위 오브젝트 : 테이블이나 인덱스의 파티션들 파티션된 테이블의 각 파티션이 서로 다른 테이블 스페이스에 존재할 수 있다.
ROW ID : 해당값을 통해 물리적인 저장 위치를 찾아낼 수 있다. 이는 논리적인 값으로서 블록 내에서 로우의 위치가 이동하더라도 변하지 않는다.
로우의 이주(Migration) : 블록 밖으로 로우가 이동할 경우 이전 블록에 옮긴 주소를 넣어놓는 방법이 있는데 이에 따른 오버헤드를 감수해야한다. 이를 로우의 이주라 한다.
체인 : 로우의 길이가 블록을 넘을 때 블록을 연결해서 저장해야하는데 이를 체인이 발생했다라고 한다.

1.1.2 클러스터링 팩터

클러스터링 팩터 : 인덱스 로우의 순서와 테이블에 저장되어있는 데이터 로우의 위치가 얼마나 비슷한 순서로 저장되어 있느냐에 대한 정도를 의미.
클러스터링 팩터는 액세스 효율에 직접적인 영향 : 클러스터링 팩터가 좋은 인덱스로 액세스를 하면 적은 블록을 액세스 하게 되므로
클러스터링 팩터를 향상시키는 방법

  1. 임의의 위치에 저장하는 방식.
  2. 주기적으로 테이블 재생성.

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

가) 넓은 범위의 액세스 처리에 대한 대처방안

이는 임의의 영역에 데이터가 저장되는 형태로서 액세스할 경우 대가가 크다.

  • 소형테이블의 경우 : 임의로 저장해도 액세스 할 때도 큰 영향이 없다.
  • 중형테이블의 경우 : 어느컬럼에 맞추어 저장할것인지 결정
  • 대형테이블의 경우 :
  1. 단순 저장형(ex: log) : 신속한 저장이 요구되므로 분리형이 가장 적절하다. 또한 데이터의 양이 많으므로 파티션과 같은 조치 필요
  2. 주로 랜덤액세스이며 다양하지 않은 액세스 형태(ex: 고객): 분리형 구조가 적당. 한번에 대량의 급격히 들어오는 경우가 드물고 범위처리를 자주 하지도 않음.
  3. 데이터가 지속적으로 증가 및 다양하 형태의 액세스(ex: 매출) : 파티션을 진행하고 인덱스를 전략적으로 구성하고 SQL 실행계획 최적화.
나) 클러스터링 팩터 향상 전략

주기적으로 테이블을 재성성시켜주는 방법이 최고! (이때는 관련 인덱스를 모두 제거하거나 비활성화 할것- 저장속도 저하유발 및 인덱스 분할로 인한 저장밀도가 나빠짐)
이를 위해 가장 유리한 형태로 저장되도록 하고 자주 범위처리를 하는 컬럼들로 정렬하자!

Share