SQL INDEX

ㅊㄷㅁ·2023년 9월 14일
0

StepByStepSQL

목록 보기
1/1

SQL Index 란?

  • Index란 해당 테이블의 인스턴스(혹은 레코드)가 해당 컬럼들로 단일성을 갖출 수 있게 하는 것을 의미한다.

  • 주요기능 : 컬럼을 단일화 시켜 찾고자 하는 데이터(레코드)를 효율적인 리소스로 찾을 수 있다.

DB는 기본적으로 데이터를 수평적(Horizontal)으로 읽는다. 즉, 10만 열의 데이터가 있는 테이블이라면 테이블 접근을 10만번 해야한다. 이는 데이터 양이 많아질수록 리소스의 성능이 저하됨을 말한다.

Index Scan


  • Index를 사용하면 열을 수평이 아닌 수직으로 먼저 읽을 수 있다.
ProductInsp_DateResult
000004PRO092019-06-18Y
000004PRO102019-06-19Y
000004PRO112019-06-19N
000004PRO122019-06-19N
000001PRO012019-06-20N
000001PRO022019-06-20Y
000001PRO032019-06-20Y
000001PRO042019-06-20Y
000001PRO052019-06-20Y
000001PRO062019-06-20N
000001PRO072019-06-20N
000001PRO082019-06-20N
000001PRO092019-06-21Y
000001PRO102019-06-21Y
000001PRO112019-06-21Y
000001PRO122019-06-21Y

위와 같은 데이터가 10만개가 있고 Reasult = N 이고 Insp_date = 2019-06-19인것을 조회하고 싶다면?

Solution 1


  1. 첫번째 방법은 앞서 말한 바와 같이 Table Full Scan 방법이다. 10만개의 데이터가 있으니 수평적으로 Table Acceess 를 10만번 해야해 IO 양이 넘침으로 안좋은 방법이다.

Solution 2


  1. ResultInsp_Date를 Index Column으로 두고 확인하는 방법이다. 첫번째 방법보다 IO가 급격히 줄어들어 효과적으로 데이터를 조회 할 수 있다.(원하는 인스턴스/레코드만 Access 한다.)

Solution 3


Insp_DateResult를 Index Column으로 두고 확인하는 방법이다. 두번째 방법과 유사해 보이지만 카디널리티라는 개념을 알고 있다면 똑같아 보이지 않을것이다.

카디널리티(Cardinality)란 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.

예를들어 주민등록번호는 고유하기 때문에 카디널리티가 높지만, 그에 반에 이름은 중복의 경우 수 가 높기 때문에 카디널리티가 낮다

카디널리티를 이해하고 본다면 Insp_Date의 데이터는 날짜이기 때문에 모든 행에서 다른 고유한 날짜 값을 가질 수 있어 카디널리티가 높고(18/19/20/21...) 반면 Reasult는 최대 고유값은 2개(N/Y)의 중복도를 가져 카디널리티가 낮다.

카디널리티의 개념으로 접근한다면 해당 지수가 높은것이 선두로 조회가 되야 효율적인 조회 방법이다. Reasult를 먼저 조회한다면 몇만의 데이터(N/Y)에서 3개(2019-06-19)를 찾지만 Insp_Date를 한다면 3개의 데이터에서 2개를 찾는다.

Solution 4


  1. 4번째 방법은 Insp_Date만 확인하는 방법이다. Index 컬럼은 많아질수록 Memory량이 많아지며 기본적으로 Clustering factor를 하면 오히려 많은 IO를 가진다 그래서 Insp_Date만 조회한다면 Result를 컬럼을 인덱스에 조회하지 않기 떄문에 리소스에 이득을 볼 수 있다.

즉 만약 해당 데이터베이스에서 앞의 예시처럼만 나온다고 한다면 어차피 2019-06-19 개수는 3개밖에 없다. 여기서 또 수직 확인하기 위하여 해당 테이블에 index를 넣는 것은 오히려 비효율적이란 의미이다.

참고
Easy Developer

profile
ㅊㄷㅁ

0개의 댓글