Database Index
- OR 조건은 인덱스 억세스, 필터 조건으로 사용할 수 없고 테이블 필터 조건으로만 사용 가능
- Between 패턴을 쓸려면 인덱스 선두 컬럼인지 , null 허용 컬럼인지 확인 하자
인덱스 선택 기준
가장 중요한..
- 조건절에 자주 사용하는 컬럼을 인덱스로
- “=” 조건으로 조회하는 칼럼을 선두 인덱스로
그 이외
- 인덱스를 너무 많이 생성하면 DML 이 느려진다.
- 수행 빈도가 낮다면 인덱스를 굳이 생성할 필요가 없다.
- nl JOIN 의 INNER 쪽은 ‘=’ 조건 컬럼을 선두에 두는 것이 중요하고 될 수 있으면 테이블 엑세스 없이 인덱스에서 필터링을 마치도록 구성해야 한다.
- 조건절에 사용하지 않는 칼럼이라도 소트 연산을 생략할 목적으로 인덱스 구성에 포함시킬 수 있다.
소트 연산을 생량 할 수 있는 인덱스 구성
- “=” 연산자로 사용한 조건절 컬럼을 인덱스에 추가
- order by 절에 기술한 컬럼 추가
- ‘=’ 연산자가 아닌 조건절 컬럼은 데이터 분포를 고려해서 추가 여부 결정
예)
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 방식으로 조인하라는 의미이다.
블로그 구독하기 !!