1.1 테이블과 인덱스의 분리
테이블과 인덱스가 분리되어 있는것은 관계형 DB의 일반적인 형태이다.
과거엔 키와 데이터가 붙어있었다면 현재는 키를 통해 데이터를 한번 더 찾아가야한다.
1.1.1 분리형 테이블의 구조 7p
활용가능한 블록을 Free List에 기록했다가 데이터를 저장할 때 제공한다.
로우가 끊어지게 될 경우 Free Space를 활용하여 재배치를 하도록 한다.
테이블스페이스 : 논리적인 저장공간을 의미하며 이는 물리적인 데이터 파일로 구성된다.
세그먼트 : 테이블 스페이스를 용도별로 나눈것
오브젝트 : 세그먼트에 들어올 수 있는것.
단위 오브젝트 : 테이블이나 인덱스의 파티션들 파티션된 테이블의 각 파티션이 서로 다른 테이블 스페이스에 존재할 수 있다.
ROW ID : 해당값을 통해 물리적인 저장 위치를 찾아낼 수 있다. 이는 논리적인 값으로서 블록 내에서 로우의 위치가 이동하더라도 변하지 않는다.
로우의 이주(Migration) : 블록 밖으로 로우가 이동할 경우 이전 블록에 옮긴 주소를 넣어놓는 방법이 있는데 이에 따른 오버헤드를 감수해야한다. 이를 로우의 이주라 한다.
체인 : 로우의 길이가 블록을 넘을 때 블록을 연결해서 저장해야하는데 이를 체인이 발생했다라고 한다.
1.1.2 클러스터링 팩터
클러스터링 팩터 : 인덱스 로우의 순서와 테이블에 저장되어있는 데이터 로우의 위치가 얼마나 비슷한 순서로 저장되어 있느냐에 대한 정도를 의미.
클러스터링 팩터는 액세스 효율에 직접적인 영향 : 클러스터링 팩터가 좋은 인덱스로 액세스를 하면 적은 블록을 액세스 하게 되므로
클러스터링 팩터를 향상시키는 방법
- 임의의 위치에 저장하는 방식.
- 주기적으로 테이블 재생성.
1.1.3 분리형 테이블의 액세스 영향 요소
가) 넓은 범위의 액세스 처리에 대한 대처방안
이는 임의의 영역에 데이터가 저장되는 형태로서 액세스할 경우 대가가 크다.
- 소형테이블의 경우 : 임의로 저장해도 액세스 할 때도 큰 영향이 없다.
- 중형테이블의 경우 : 어느컬럼에 맞추어 저장할것인지 결정
- 대형테이블의 경우 :
- 단순 저장형(ex: log) : 신속한 저장이 요구되므로 분리형이 가장 적절하다. 또한 데이터의 양이 많으므로 파티션과 같은 조치 필요
- 주로 랜덤액세스이며 다양하지 않은 액세스 형태(ex: 고객): 분리형 구조가 적당. 한번에 대량의 급격히 들어오는 경우가 드물고 범위처리를 자주 하지도 않음.
- 데이터가 지속적으로 증가 및 다양하 형태의 액세스(ex: 매출) : 파티션을 진행하고 인덱스를 전략적으로 구성하고 SQL 실행계획 최적화.
나) 클러스터링 팩터 향상 전략
주기적으로 테이블을 재성성시켜주는 방법이 최고! (이때는 관련 인덱스를 모두 제거하거나 비활성화 할것- 저장속도 저하유발 및 인덱스 분할로 인한 저장밀도가 나빠짐)
이를 위해 가장 유리한 형태로 저장되도록 하고 자주 범위처리를 하는 컬럼들로 정렬하자!