두 가지의 쿼리가 있는데요 <>를 쓰면 인덱스를 타지 않는다는 설명과 함께 예제로 나와있었던 것인데
2번쿼리가 1번쿼리보다 속도가 두배정도 빠릅니다.
1.
SELECT CARRID FROM SFLIGHT
INTO WA
WHERE CARRID <> 'LH'
AND CONNID = '0400'.
ENDSELECT.
2.
SELECT CARRID FROM SFLIGHT
INTO WA
WHERE
CARRID IN
( SELECT CARRID FROM SCARR
WHERE CARRID <> 'LH' )
AND CONNID = '0400'.
ENDSELECT.
근데 2번은 본쿼리에서 <> 조건을 뺐다고 해도 결국 서브쿼리안에 <>를 쓰기때문에 인덱스를 타지 않는것 아닌가요?
왜 2번이 속도가 두배나 빠르죠?
고수님들 갈쳐주세요~ 너무 궁금합니다!
댓글 6
-
정군
2009.04.07 22:58
-
낭랑18세
2009.04.07 23:13
scarr 에 데이터가 많으면 두배까지 속도 차이는 나지 않을 것 같네요..
-
레몬과자
2009.04.07 23:20
정군님, 낭랑18세님 답변감사합니다.
저도 얼추 그런식으로 생각은 했는데 ,
단순히 인덱스를 타지않는 조건문(CARRID <> 'LH' )을 데이터가 적은 테이블에 넘김으로써 속도가 빨라지는 거라면
만약 scarr테이블에 데이터가 많다면 어쩌면 속도의 차이가 없을수도 있겠군요..
-
또리
2009.04.08 17:21
만약 scarr테이블에 데이터가 많다면 어쩌면 속도의 차이가 없을수도 있겠군요.
==>제가 알고 있기로는 부정문은 full table scan이 되기 때문에 그 양에 따라 되려 늦어질수도 있겠네요.
두 쿼리 문장을 보면서 비교 대상이 아닐 듯 생각했는데.. 나름 의미가 있어 보입니다요.
-
레몬과자
2009.04.08 20:57
2번쿼리를 잘못 사용하면 1번쿼리보다 훨씬 느려질수도 있군요..
실제 테이블을 보니 SCARR에 데이터가 하나도 없었네요.. 그래서 2배나 빨랐나봐요;;
또리님 좋은 답변 감사합니다.
-
Will
2009.06.23 21:03
좋은정보 감사합니다 ^^
crrid가 인덱스를 타느냐 아니냐를 이야기 하고 싶은 예제일 겁니다.
scarr 테이블은 인덱스를 타지 않아도 LH가 아닌 게 얼마 없을 거고..
그렇게 만들어진 조건이 carrid에서는 In으로 쓰이면서 equal이랑 같은 효과를 가져오기 때문에
인덱스를 타겠죠.