[SQL-TUNING] 테이블 엑세스 최소화 (2)

1881 단어 DatabaseDatabase

인덱스 스캔 효율화


이번 챕터는 인덱스 스캔 과정에 대해서 알아보고, 인덱스 스캔의 효율성을 높이는 방안에 대해서 설명한다.
사전지식으로 카디널리티 에 대해 간단하게 알아보고 넘어가자

카디널리티

  • 중복도가 낮으면, 카디널리티가 높다.
  • 중복도가 높으면, 카디널리티가 낮다.
  • 예를들면 주민번호는 카디널리티가 높다.
  • 반대로 성별은 카디널리티가 낮다.
  • 칼럼의 값의 종류? 로 이해하니까 훨씬 쉽게 다가온다.
  • 이것이 중요한 이유는 인덱스 칼럼을 결정함에 있어서, 카디널리티를 고려하는 것이 중요하기 때문이다.

인덱스 스캔 효율성

  • 책에서는 예시가 주저리주저리 써있지만, 포스팅에서는 나만의 예시를 통해 이해해보고자 한다.

상황

  • 유저 테이블을 만들어야한다.
  • 유저의 ID, NAME, LOCATION 정보만 저장한다고 가정한다.
CREATE INDEX idx_localtion_first ON users(location, name, id)
CREATE INDEX idx_id_first ON users(id, name, location)
  • 위 2가지의 인덱스 방법 중에서 어떤 인덱스 방식이 나을까?
  • 지역(LOCATION)의 경우 상대적으로 카디널리티가 낮고, ID의 경우 카디널리티가 높다.
  • 앞선 포스팅에서 인덱스는 b+ tree 구조로 저장되어있으며, 수직탐색 + 수평탐색 + 랜덤 I/O를 최소화 하는 것이 이득이라고 했다.
  • 결과적으로 카디널리티가 높은 ID를 선행 인덱스 칼럼으로 두는 것이 효과가 더 좋다.
  • 왜냐하면 트리구조에서 비교연산이 들어갈 터인데, 정렬되어있는 인덱스 트리에서 더 확실한 값을 기준으로 하여 수직탐색을 하는 것이 가장 적게 인덱스 트리 탐색을 진행하기 때문이다.

BETWEEN

  • 만일 WHERE 절에, (=)와 같은 등치를 활용한다면 범위형 비교 연산이 들어가게 된다. (이상 ~ 미만)
  • 따라서 비교연산은 인덱스 구성 칼럼들 중에서, 후행 칼럼에 두는 것이 나은 경우가 있다. (테이블 데이터들의 구성에 따라 다르다.)
  • 그 이유는 수직 탐색 횟수를 줄일 수 있기 때문이다.

IN LIST

  • IN 리스트는 후보 리스트 들 중에서 (=)와 같은 등치를 진행하는 것이 맞긴 하다.
  • 하지만 인덱스 칼럼들 구성과 조건절에 따라 오히려 좋지 않은 결과를 보여줄 때가 있다.
  • 예를 들어 정렬된 리스트 들 중에서, 리프노드에서 IN LIST를 활용하면, 클러스터링이 잘 되어있는 경우 블록접근이 더욱 빠르게 연산되는 경우가 있다.
  • 하지만 루트노드나 브랜치에서 IN LIST를 활용한다면 수직, 수평 접근이 많아지기도 한다.
  • INDEX SKIP RANGE SCAN을 활용하는 것과 비슷한 방법으로 활용하는 것이 좋다.

LIKE

  • BETWEEN 보다도 좋지 않은 LIKE절은 FULL SCAN 보다 좋지 않은 성능을 낼 때가 있다.
  • 편의상 사용하지만 최소화하여 사용하는 것이 좋다.
  • 왜 좋지 않은 지에 대해서는 다른 포스팅들을 찾아보자. 사실 조금만 생각해봐도 이해할 수 있다.

좋은 웹페이지 즐겨찾기