Database Index


  1. OR 조건은 인덱스 억세스, 필터 조건으로 사용할 수 없고 테이블 필터 조건으로만 사용 가능 
  2. Between 패턴을 쓸려면 인덱스 선두 컬럼인지 , null 허용 컬럼인지 확인 하자 

 

인덱스 선택 기준 

가장 중요한..

  1. 조건절에 자주 사용하는 컬럼을 인덱스로 
  2.  “=” 조건으로 조회하는 칼럼을 선두 인덱스로 

그 이외

  1. 인덱스를 너무 많이 생성하면 DML 이 느려진다. 
  2. 수행 빈도가 낮다면 인덱스를 굳이 생성할 필요가 없다. 
  3. nl JOIN 의 INNER 쪽은  ‘=’ 조건 컬럼을 선두에 두는 것이 중요하고 될 수 있으면 테이블 엑세스 없이 인덱스에서 필터링을 마치도록 구성해야 한다. 
  4. 조건절에 사용하지 않는 칼럼이라도 소트 연산을 생략할 목적으로 인덱스 구성에 포함시킬 수 있다. 

 

소트 연산을  생량 할 수 있는 인덱스 구성 

  1. “=” 연산자로 사용한 조건절 컬럼을 인덱스에 추가 
  2. order by 절에 기술한 컬럼 추가 
  3. ‘=’ 연산자가 아닌 조건절 컬럼은 데이터 분포를 고려해서 추가 여부 결정 

예)

select *
from 계약
where 취급지점ID= :?
and 청약일자 between 2010 and 2020
and 입력일자 > 2001
order by 청약일자, 입력ID

 

위 쿼리에서는  취급지점 ID + 청약일자 + 입력자ID 로 인덱스 구성 

 

IN 은 “=” 이 아니다. 

in 조건절은 인덱스 엑세스 조건으로  사용해서는 안되고 필터 조건으로 사용해야 한다. 

select *
from customer
where town = '서울'
and 혈액형 ('a', 'b')
order by age

인덱스 가 town,  혈액형,  age 라고 하자 그러면 SQL 은 혈액형 에 따라 데이터를 조회한 뒤 Union 하게 되는데 위 sort 를 생략하려면 a 형의 연령이 b 형보다 작아야한다. 이는 말이 안됨으로 sql 은 소트 연산을 한다. 그럼으로 인덱스를 town, age, 혈액형으로 해야 한다. 

인덱스 액세스 조건

  • 인덱스 스캔 범위를 결정하는 조건절
  • 인덱스 수직적 탐색을 통해 스캔 시작점을 결정하는 데 영향을 미치고, 인덱스 리프 블록을 스캔하다가 어디서 멈출지를 결정하는 데 영향을 미치는 조건절

인덱스 필터 조건

  • 테이블로 액세스할지를 결정하는 조건절
  • 인덱스를 이용하든, 테이블을 Full Scan 하든, 테이블 액세스 단계에서 처리되는 조건절은 모두 필터 조건이다.

 

카디널리티 (인덱스 선택도) 가 낮은 걸 인덱스로 넣는다. 

카디널리티는 = 조건으로 조회 했을때 데이터가 출력되는 양이다. 

카디넡리티가 매우 낮은 칼럼과 다른 칼럼을 조합한 인덱스는 중복 인덱스 임으로 필요하지 않을 수 있다. 

예) 아래 두개는 중복에 가깝다. 

id + 청약일자

id + 보험 종료 일자 

 

NL 조인에서 Inner 쪽은 Index를 사용해야 한다. 

NL 조인은 중첩 루프와 비슷하게 동작한다. Outer 쪽 데이터가 적다면 Table Full Scan으로 데이터를 한방에 가져온다. 그리고 루프를 돌면서 Inner 쪽 데이터를 Full Scan 하게 된다. (Index 가 없다면)

from a, b 에 힌트 ordered use_nl(b) 가 붙는다면 a(Outer=Driving)를 기준으로 b(Inner)와 NL 방식으로 조인하라는 의미이다. 

 

 

 



블로그 구독하기 !!

You may also like...