MS-SQL 강제로 인덱스 타게 만들기

6 Comments

MS-SQL 은 이상하게 쿼리가 조금만 복잡해지면 인덱스를 제대로 타지 못하는 경우가 종종 발생하는데, 그 경우에 제대로 된 인덱스를 타게 하려면 다음과 같이 한다. (특히 JOIN 을 사용할 경우 ON 절에 들어가는 필드가 PK 가 아닐 경우에 인덱스를 안탈 수 있는데, 이럴 때 유용하게 사용할 수 있다)

SELECT * FROM ALLBLOG WITH(INDEX(IX_ALLBLOG_BLOG))
WHERE BLOG=7777777

이렇게 하면 IX_ALLBLOG_BLOG 라는 인덱스를 강제로 타서 결과를 리턴한다.

복잡한 쿼리를 만들 때는 반드시 다음과 같은 옵션들을 사용해서 인덱스를 잘 타고 있는지, 부하는 어느정도 들어가고 있는지를 파악할 수 있도록 한다.

SET SHOWPLAN_ALL ON
SET STATISTICS IO ON
SET STATISTICS TIME ON

오늘 오타나서 살짝 고생한김에 정리해봄..ㅡ,ㅡ;;;

6 Comments (+add yours?)

  1. 키엘
    Jan 29, 2007 @ 11:39:44

    MS-SQL은 힌트를 명시적으로 주지 않는걸 권장하는것으로 알고 있습니다. (MS 차원에서) 통계를 정리해보시거나 인덱스 rebuild를 해보시죠.

  2. 골빈해커
    Jan 29, 2007 @ 12:13:06

    키엘 / 감사합니다. 그걸 했는데도 여전히 느리더라구요. 그래서 저 방법을 썼는데, 무지 빨라지더군요. 저게 적당한건지 뭐가 잘못되서 그런건지는 아직도 모르겠습니다..머리가 나쁘면 손발이 고생한다더니…흑.. ㅜ_ㅜ

  3. 땡글
    Nov 15, 2007 @ 23:08:59

    세상에서 오라클이 최고야~를 외치는 저이지만 그래도 MS-SQL의 Optimizer가 멍청하다고 생각하진 않습니다.

    인덱스를 타지 않도록 하는 다른 원인이 있지 않을까요?

  4. 후후
    May 13, 2009 @ 09:58:11

    1. 인덱스 컬럼에 변형이 일어난 경우

    WHERE TO_CHAR(HIREDATE,’YYYYMMDD’) = ’19980518′;

    WHERE SALARY + 1000 > 100000;

    2. 내부적인 변형이 일어난 경우

    WHERE EMP_ID = 200383;

    3. NULL을 비교하였을 경우

    WHERE JOB IS NULL;

    4. 부정형으로 조건을 기술한 경우

    WHERE JOB NOT IN ( ‘INSTRUCTOR’,'STAFF’);

  5. tomato313
    Aug 26, 2010 @ 15:30:39

    큰 도움 되었습니다. 감사해요~

  6. My Homepage
    Dec 09, 2011 @ 08:16:41

    When I originally commented I clicked the -Notify me when new surveys are added- checkbox and from now on whenever a comment is added I purchase four emails sticking with exactly the same comment. Possibly there is by any indicates you could get rid of me from that service? Thanks! 357778

Leave a Reply