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

SQL Server 2005 이상 버전에서는 아래의 DMV를 통하여 어떠한 테이블에 인덱스가 없어 성능적으로 영향을 주는지 확인 할 수 있습니다.

sys.dm_db_missing_index_groups

sys.dm_db_missing_index_group_stats

sys.dm_db_missing_index_details


또한 예전에 소개하였듯이 SQL Server 2008에서는 그래픽 실행계획에서 missing index에 대한 정보도 바로 확인 할 수 있습니다.

하지만 여전히 missing index로 잡히게 한 쿼리의 원본은 쉽게 확인 할 수가 없습니다.
그래서 이번에 소개하는 내용은 조금 더 쉽게 missing index를 유발한 쿼리를 찾아보는 것입니다.

XML 실행계획에 이 missing index에 대한 정보도 같이 저장 되어있기에 전에 소개했던 DMV를 조금 응용하면 특정 테이블에 어떤 쿼리로 인해 missing index가 등록되었는지 쉽게 확인 할 수 있을 것입니다.


자세한 내용은 아래를 참고하세요.

with XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as sql)

SELECT --TOP 10

           db_name

           ,sp_name

           ,sp_text

           ,[statement_text]

           ,X.*

           ,[creation_time]

           ,[ExecutionCount]

 FROM

             (

                     SELECT

                                db_name(qt.dbid) AS 'db_name'

                                ,qt.text AS 'sp_text'

                                , substring(qt.text, (qs.statement_start_offset/2)+1

                                          , ((case qs.statement_end_offset

                                          when -1 then datalength(qt.text)

                                          else qs.statement_end_offset

                                          end - qs.statement_start_offset)/2) + 1) as statement_text

                                , qs.creation_time

                                , qs.execution_count AS 'ExecutionCount'

                                , cast(qp.query_plan as xml) as query_plan

                                ,OBJECT_NAME(qp.objectid,qp.dbid) as sp_name

                     FROM sys.dm_exec_query_stats AS qs

                                CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt

                                CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle,qs.statement_start_offset,qs.statement_end_offset) qp

           )Y

CROSS APPLY

(

      SELECT

       c.value('(./@Impact)[1]','float') as missing_index_Impact

       ,c.value('(./sql:MissingIndex/@Database)[1]','varchar(100)') + '.'+

       c.value('(./sql:MissingIndex/@Schema)[1]','varchar(100)') + '.'+

       c.value('(./sql:MissingIndex/@Table)[1]','varchar(100)') as [missing_index_Table]

      

       FROM Y.query_plan.nodes('//sql:MissingIndexGroup')B(C)

)X



 

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