2010-06-04 3 views
3

SQL Server 2008을 사용하고 있으며 DMV를 사용하여 누락 된 인덱스를 찾습니다. 그러나 새 인덱스를 만들기 전에 proc/query가 해당 인덱스를 원하고 있는지 파악하려고합니다. 내가 얻을 수있는 가장 많은 정보를 원한다면 색인에 대한 정보에 입각 한 결정을 내릴 수 있습니다. 때로는 SQL Server에서 원하는 인덱스가 이해가되지 않는 경우가 있습니다. 아무도 내가 원하는 것을 알아낼 수있는 방법을 알고 있습니까?SQL Server - 누락 된 인덱스 - 인덱스는 무엇을 사용합니까?

답변

2

마지막 일 것입니다 :

with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') , CachedPlans as (
select 
query_plan, 
n.value('../../../@StatementText' ,'varchar(1000)') as [Statement], 
n.value('../../../@StatementSubTreeCost' ,'varchar(1000)') as [Cost], 
n.value('../../../@StatementEstRows' ,'varchar(1000)') as [Rows], 
n.value('@Impact' ,'float') as Impact, 
n.value('MissingIndex[1]/@Database' ,'varchar(128)') as [Database], 
n.value('MissingIndex[1]/@Table' ,'varchar(128)') as [TableName], 
(
    select dbo.concat(c.value('@Name' ,'varchar(128)')) 
    from n.nodes('MissingIndex/ColumnGroup[@Usage="EQUALITY"][1]') as t(cg) 
    cross apply cg.nodes('Column') as r(c) 
) as equality_columns, 
(
    select dbo.concat(c.value('@Name' ,'varchar(128)')) 
    from n.nodes('MissingIndex/ColumnGroup[@Usage="INEQUALITY"][1]') as t(cg) 
    cross apply cg.nodes('Column') as r(c) 
) as inequality_columns, 
(
    select dbo.concat(c.value('@Name' ,'varchar(128)')) 
    from n.nodes('MissingIndex/ColumnGroup[@Usage="INCLUDE"][1]') as t(cg) 
    cross apply cg.nodes('Column') as r(c) 
) as include_columns 
from (
select query_plan 
from sys.dm_exec_cached_plans p 
outer apply sys.dm_exec_query_plan(p.plan_handle) tp 
) as tab(query_plan) 
cross apply query_plan.nodes('//MissingIndexGroup') as q(n) 
) 
select * 
from CachedPlans 
+0

dbo.concat은 무엇인지 명확히 할 수 있습니까? –

+0

dbo.concat을 다음과 같이 바 꾸었습니다 :'SELECT STUFF (([...] FOR XML PATH ('')), 1, 2, '')', [...]를 쿼리 내가 열을 concat 싶어요; n.nodes ('MissingIndex/ColumnGroup [@ Usage = "EQUALITY"] [1]')에서 SELECT STUFF ((select c.value ('@ Name', 'varchar (128)')) cg.nodes ('Column')을 r (c) FOR XML PATH (''), 1, 2, '')로 교차 적용 –

0

프로파일 러 추적을 실행하고 실행중인 절차와 인덱스 검색/사용에 대한 효율성을 확인할 수 있습니다.

모든 사람의 모든 색인을 작성하는 것이 아니라 가장 큰 문제를 최적화하는 것이 좋습니다. 일반적으로 가장 큰 이점을 얻을 수 있습니다.

프로파일 러 추적에서 저장된 proc/tsql 문이 가장 많은 횟수로 실행되고 대부분의 리소스를 사용하는지 확인합니다. 그것들은 당신이 정말로 가고 싶어하는 것들입니다.

+0

이 내가 요구하고 무엇을 정말하지 않습니다. SQL의 DMV (sys.dm_db_missing_index_details)는 누락 된 인덱스 목록을 제공합니다. 색인을 만들면 색인을 어떻게 사용하는지 알고 싶습니다. – BankZ

+0

@BankZ 프로파일 러 경로를 지정해야하는 이유는 dm_db_missing_index_details가 누락 된 색인이 무엇인지 알려주지 만 얻을 수있는 이득이 얼마인지 알 수 없기 때문입니다. IMO는 실제로 가장 큰 문제를 일으키는 쿼리를 최적화하는 것이 더 나은 옵션입니다. –

+0

DMV가 우리가 사용하는 유일한 것이 아니라는 것을 이해합니다. 우리는 추적을하고 실행 계획을 살펴 봅니다. 그러나 24/7을 추적 할 수 없으며 DMV에는 많은 정보가 있습니다 (누락 된 색인 비용 및 일부 이점에 대한 견적을 제공합니다). 그러나, 그 말했다, 그것은 여전히 ​​내 질문에 대답하지 않습니다 :) – BankZ

4

당신은 QUERYTEXT를 나열이 쿼리처럼 뭔가를 시도 할 수 :

;WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan') 
, CachedPlans AS 
(SELECT 
    RelOp.op.value(N'../../@NodeId', N'int') AS ParentOperationID 
     ,RelOp.op.value(N'@NodeId', N'int') AS OperationID 
     ,RelOp.op.value(N'@PhysicalOp', N'varchar(50)') AS PhysicalOperator 
     ,RelOp.op.value(N'@LogicalOp', N'varchar(50)') AS LogicalOperator 
     ,RelOp.op.value(N'@EstimatedTotalSubtreeCost ', N'float') AS EstimatedCost 
     ,RelOp.op.value(N'@EstimateIO', N'float') AS EstimatedIO 
     ,RelOp.op.value(N'@EstimateCPU', N'float') AS EstimatedCPU 
     ,RelOp.op.value(N'@EstimateRows', N'float') AS EstimatedRows 
     ,cp.plan_handle AS PlanHandle 
     ,qp.query_plan AS QueryPlan 
     ,st.TEXT AS QueryText 
     ,cp.cacheobjtype AS CacheObjectType 
     ,cp.objtype AS ObjectType 
     ,cp.usecounts AS UseCounts 
    FROM sys.dm_exec_cached_plans       cp 
     CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle)  st 
     CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp 
     CROSS APPLY qp.query_plan.nodes(N'//RelOp')   RelOp (op) 
) 
SELECT 
    PlanHandle 
     ,ParentOperationID 
     ,OperationID 
     ,PhysicalOperator 
     ,LogicalOperator 
     ,UseCounts 
     ,CacheObjectType 
     ,ObjectType 
     ,EstimatedCost 
     ,EstimatedIO 
     ,EstimatedCPU 
     ,EstimatedRows 
     ,QueryText 
    FROM CachedPlans 
    WHERE CacheObjectType = N'Compiled Plan' 

AND PhysicalOperator IN ('nothing will ever match this one!' 
         --,'Assert'        
         --,'Bitmap' 
         --,'Clustered Index Delete' 
         --,'Clustered Index Insert' 
         ,'Clustered Index Scan' 
         --,'Clustered Index Seek' 
         --,'Clustered Index Update' 
         --,'Compute Scalar' 
         --,'Concatenation' 
         --,'Constant Scan' 
         ,'Deleted Scan' 
         --,'Filter' 
         --,'Hash Match' 
         ,'Index Scan' 
         --,'Index Seek' 
         --,'Index Spool' 
         ,'Inserted Scan' 
         --,'Merge Join' 
         --,'Nested Loops' 
         --,'Parallelism' 
         ,'Parameter Table Scan' 
         --,'RID Lookup' 
         --,'Segment' 
         --,'Sequence Project' 
         --,'Sort' 
         --,'Stream Aggregate' 
         --,'Table Delete' 
         --,'Table Insert' 
         ,'Table Scan' 
         --,'Table Spool' 
         --,'Table Update' 
         --,'Table-valued function' 
         --,'Top' 
         ) 

그냥 UseCounts 및 EstimatedCost의 조합과 같은에 의해 주문을 추가 할 수 있습니다. 여기

+0

아주 흥미로운 출발점. 나는 내가 이것으로 무엇을 할 수 있는지 알게 될 것이다. 고맙습니다. – BankZ