代码之家  ›  专栏  ›  技术社区  ›  BankZ

SQL Server-缺少索引-该索引将使用什么?

  •  3
  • BankZ  · 技术社区  · 14 年前

    我正在使用SQL Server 2008,我们正在使用DMV查找缺少的索引。然而,在我创建新索引之前,我试图弄清楚什么proc/query需要这个索引。我想要我能得到的最多的信息,这样我就可以对我的索引做出明智的决定。有时候SQL Server需要的索引对我来说没有意义。有人知道我怎么知道我想要什么吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   KM.    14 年前

    您可以尝试类似这样的查询,它列出了查询文本:

    ;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'
                            )
    

    只需添加一个order by,比如usecounts和estimatedcost的组合。

        2
  •  2
  •   BankZ    14 年前

    以下是最后的工作:

    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
    
        3
  •  0
  •   Raj More    14 年前

    您可以运行探查器跟踪并检查正在运行的过程及其在索引查找/使用方面的有效性。

    与其为每个人都做所有的指数,不如优化最大的问题——你通常会从中得到最大的好处。

    在探查器跟踪中,找出哪个存储的proc/tsql语句运行的次数最多,消耗的资源最多。这些是你真正想要追求的。