* 참고사이트 : 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 = '눈'
댓글 없음:
댓글 쓰기