Search

2015년 12월 7일 월요일

[Database] [MSSQL] where 조건문에 대한 쿼리 성능 튜닝.

* 오늘은 쿼리의 Where 조건문에 대한 쿼리 성능에 대한 주제를 다뤄보려 한다. 참고로 앞으로 본문에서 다룰 모든 테이블과 데이터의 수치에 대해서는 설명을 위해 임의로 가정한 내용임을 참고하자. 추가로, 본문에서는 간단한 개념만 소개하므로, 자세한 내용은 아래의 참고사이트를 읽어보도록 하자.
* 참고사이트 : http://www.cs.rtu.lv/PharePub/Teach%20Yourself%20Sql%20In%2021%20Days%202nd%20Edition/ch15/ch15.htm


예를 들어, A_Table에 1억개의 행이 존재하고, 5개의 컬럼이 존재하는데, 각각의 조건은 다음과 같다고 가정해보자. (모든 컬럼에 인덱스는 없다고 가정하자.)

 - A_Table :                     100,000,000 개의 행

 - Date_Column :              2015년 1월 1일 ~ 2015년 12월 31일 까지의 날짜가 존재.
 - Passenger_Column :       이용객의 ID가 존재.
 - Transportation_Column : 교통 구분. (지하철, 버스, 택시, 비행기 등)
 - Weather_Column :         기상상태. (맑음, 눈, 비, 흐림 등)
 - Precipitation_Column    : 강수량 mm. (눈이나 비가 왔을 경우에만 존재)

만약, A_Table에서 눈이 10mm이상 내리는 날에 각 날짜별로 택시를 탄 이용객의 ID를 모두 뽑는 쿼리를 작성한다고 생각해보자.

SELECT   Date_Column, Passenger_Column
FROM    A_Table
WHERE   Transportation_Column = '택시'
    and    Weather_Column = '눈'
    and    Precipitation_Column >= 10

분명 위와 비슷한 쿼리를 작성하게 될 것이다(Where 조건의 순서가 다를 수 있으므로). 하지만, 우리가 결과를 가져와야 할 테이블에는 1억건이라는 데이터가 있다는 사실을 망각해서는 안된다.


* 어떤 조건부터 나열하는 것이 쿼리의 성능에 최적의 배치일까??

예를 들어, A_Table의 컬럼들은 아래와 같은 Count 값을 갖는다고 가정해보자.

SELECT   Count(*)
FROM    A_Table
WHERE   Transportation_Column = '택시'
-- > 결과 값 : 5,000,000

SELECT   Count(*)
FROM    A_Table
WHERE   Weather_Column = '눈'
-- > 결과 값 : 50,000

SELECT   Count(*)
FROM    A_Table
WHERE   Precipitation_Column >= 10
-- > 결과 값 : 1,000,000

여기서 제약이 큰 검색조건 순으로 나열하면 다음과 같다.

  1. Weather_Column = '눈'              --> 결과값 : 50,000
  2. Precipitation_Column >= 10        --> 결과값 : 1,000,000
  3. Transportation_Column = '택시'   --> 결과값 : 5,000,000


* MSSQL의 경우에는, Where문을 뒤에서부터 읽기 때문에 제약조건이 큰 조건을 아래에 배치할 수록 쿼리에 대한 응답속도가 빠르게 나타난다. 
따라서 최적의 쿼리는 다음과 같다. (오라클 데이터베이스의 경우에는 정 반대이다.)

SELECT   Date_Column, Passenger_Column
FROM    A_Table
WHERE   Transportation_Column = '택시'
    and    Precipitation_Column >= 10
    and    Weather_Column = '눈'

댓글 없음:

댓글 쓰기