SQL 레벨업이라는 도서를 정리한 내용입니다.
RDB에서 사용하는 인덱스는 구조에 따라 세 가지로 분류된다.
데이터를 트리 구조로 저장하는 인덱스로, 뛰어난 범용성을 가지고 있다. 아무런 수식 없는 '인덱스'는 B-tree인덱스를 지칭하는 것이다.
사실 대부분의 DBMS는 트리의 리프 노드에만 키값을 저장하는 B+tree라는 B-tree의 수정 버전을 채택하고 있다.
비트맵 인덱스는 데이터를 비트 플래그로 반환해서 저장하는 형태의 인덱스로 카디널리티가 낮은 필드에 높은 효과를 가진다. 하지만 갱신할 때 오버헤드가 너무 크기 떄문에 빈번한 갱신이 일어나지 않는 BI/DWH 용도로 쓰인다.
해시 인덱스는 키를 해시 분산해서 등가 검색을 고속으로 질행하고자 만들어졌다. 하지만 등가 검색 외에는 효과가 거의 없고 범위 검색이 불가능 하기 때문에 자주 사용되지 않는다. 또한 지원하는 DBMS도 많지 않다.
카디널리티가 높고 선택률이 낮을수록 좋은 성능을 가진다.
최근 DBMS는 대체로 5~10% 이하의 선택률을 가지는 경우 인덱스를 사용하는 것을 권장하고 있다. 이 선택률을 저장소 성능 향상과 반비례 한다.
따라서 데이터의 선택률이 5~10%를 넘어가면 테이블 풀 스캔이 빠를 가능성이 커진다.
저장소애 같은 값이 어느 정도 물리적으로 뭉쳐 존재하는 지를 나타내는 지표이다. 높을수록 분산되어 있고, 낮을수록 뭉쳐있다는 뜻이다. 인덱스로 접근할 때는 보통 특정 값에만 접근하는 경우가 많으므로 클러스터링 팩터가 낮을수록 효율이 좋다.
SQL 구문이 간단해서 WHERE 구 같이 레코드를 압축하는 조건이 없는 경우 인덱스를 사용할 수 없다. 사실 실무에서 이와 같은 상황은 매우 드물다.
레코드를 제대로 압축하지 못하는 경우는 대표적으로 아래와 같은 경우가 있다.
WHERE col_1 * 1.1 > 100
) WHERE col_1 > 100 * 1.1
이처럼 작성하면 인덱스를 사용할 수 있다.특정 기간의 무언가를 조회하고 싶을 때 기간 검색의 최대치를 정해 두는 식으로 제한을 둘 수 있다.
이러한 입력 제한을 만들 때는 사용자 혹은 엔지니어와 충분한 소통이 필요하다.
이러한 제한이 많고, 과도한 경우 협업을 진행하는 다른 직원을 피로하게 하거나 사용자의 만족도를 감소시킬 수 있다.
성능과 사용성의 트레이드오프를 통해 타협점을 찾아야 한다.
데이터 마트 혹은 개요 테이블(Summary Table)이라고도 한다. 특정한 쿼리(군)에서 필요한 데이터만을 저장하는 상대적으로 작은 테이블을 의미한다.
이는 필요한 필드의 정보만 불러오기 때문에 I/O 비용을 줄일 수 있다.
인덱스 온리 스캔은 SQL 구문에서 필요한 필드를 인덱스로 커버할 수 있는 경우에 테이블 접근을 생략하는 기술이다.
이는 필요한 필드의 정보만 불러오기 때문에 I/O 비용을 줄일 수 있다.
데이터 마트와 달리 애플리케이션의 수정이 필요 없다.