BLOG main image
분류 전체보기 (45)
SQL Server 이야기 (45)
일상 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2009. 4. 17. 11:52

쿼리에 인덱스 힌트를 사용하게 되면, 힌트에 사용되는 인덱스에 대해 이름 변경 또는 삭제와 같은 작업이 발생하게 되면
쿼리가 실행하지 못하고 에러가 발생되어 서비스에 문제를 줄 수 있습니다.

이러한 점으로 인덱스 힌트를 사용하는 환경이라면 인덱스 작업시 많은 주의가 필요합니다.

SQL Server 2000 버젼의 경우라면 이러한 인덱스 힌트를 사용한 SP를 확인하기 위해서는 syscomments 시스템테이블에서 확인 할 수 밖에 없었습니다.
이방법도 문자열을 비교하는 형태로 찾을 수 밖에 없기에 꽤나 시간 걸리는 비효율적인 작업이었습니다


SQL Server 2005부터 추가된 DMV에 있는 XML 플랜 정보를 바탕으로 인덱스 힌트를 사용한 SP 이름을 쉽게 확인 할 수 있습니다. 

아래 XML 플랜을 보시면 ForcedIndex항목으로 인덱스 힌트 사용 유무를 판단할 수 있습니다.
 <IndexScan Ordered="0" ForcedIndex="1" ForceSeek="0" NoExpandHint="0">
                    <DefinedValues>
                      <DefinedValue>
                        <ColumnReference Database="[TEST]" Schema="[dbo]" Table="[t1]" Column="c1" />

아래의 DMV 쿼리로 확인 할 수 있습니다.

SELECT

    db_name(st.dbid)

           ,object_name(st.objectid,st.dbid)

   ,st.text

   ,qp.query_plan

FROM sys.dm_exec_cached_plans cp

    cross apply sys.dm_exec_query_plan(cp.plan_handle) qp

    cross apply sys.dm_exec_sql_text(cp.plan_handle) as st

WHERE cp.cacheobjtype = 'Compiled Plan'

AND qp.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";max(//p:IndexScan/@ForcedIndex)', 'float') =1

AND st.dbid IS NOT NULL


송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com