Sql server 如何找到使用什么索引的存储过程?

Sql server 如何找到使用什么索引的存储过程?,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,我试图确定哪些索引不再在数据库中使用。我很幸运地使用了以下查询: SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], I.[NAME] AS [INDEX NAME], i.Type_Desc as [Index Type], USER_SEEKS, USER_SCANS, USER_LOOKUPS, USER_UPDATES FRO

我试图确定哪些索引不再在数据库中使用。我很幸运地使用了以下查询:

SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],
         I.[NAME] AS [INDEX NAME],
         i.Type_Desc as [Index Type],
         USER_SEEKS,
         USER_SCANS,
         USER_LOOKUPS,
         USER_UPDATES
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S
         INNER JOIN SYS.INDEXES AS I
           ON I.[OBJECT_ID] = S.[OBJECT_ID]
              AND I.INDEX_ID = S.INDEX_ID 
WHERE i.name is not null
AND 
    (   OBJECT_NAME(S.[OBJECT_ID]) = 'Table1'
        OR
        OBJECT_NAME(S.[OBJECT_ID]) = 'Table2'
        OR
        OBJECT_NAME(S.[OBJECT_ID]) = 'Table3'
    )
ORder by S.[OBJECT_ID], user_Seeks desc , user_scans desc
我现在想了解的是,是什么存储过程导致了上述查询报告的查找、扫描和查找。此信息是否存储在系统视图/表中

澄清

正如gbn指出的,存储过程不直接使用索引,而是使用使用索引的表。下面是一个解释,我希望能澄清我在这里想问的问题


我是否可以确定运行了哪些SQL导致使用了上述索引?例如,如果报告的其中一个索引有10个用户搜索,是否可以在SQL management studio中确定
exec sp_1
导致该使用7次,而
exec sp_2
导致该使用3次?

,您可以通过使用“显示执行计划”准确查看查询的执行方式查询菜单下的选项。

编辑(问题更新后再次):

没有现实的机会。您可以尝试profiler并捕获textplan。我看过一次,但它杀死了一个服务器:需要记录的文本太多了。YMMV:-)

存储过程不使用索引

存储过程使用表(和索引视图),然后使用索引(或不使用上面的方法)

Doing
从myTable中选择col1,col2,其中col2='foo'顺序按col1
是相同的,无论它是在存储过程、视图、用户定义函数中还是它本身

编辑:我们的索引使用脚本,从某处下载

SELECT
    o.name AS [object_name], 
    i.name AS index_name, 
    i.type_desc, 
    u.user_seeks, u.user_scans, 
    u.user_lookups, u.user_updates,
    o.type
FROM
    sys.indexes i
    JOIN
    sys.objects o ON i.[object_id] = o.[object_id]
    LEFT JOIN 
    sys.dm_db_index_usage_stats u ON i.[object_id] = u.[object_id] AND 
                                    i.index_id = u.index_id AND 
                                    u.database_id = DB_ID()
WHERE
    o.type IN ('U', 'V') AND
    i.name IS NOT NULL
ORDER BY 
    u.user_seeks + u.user_scans + u.user_lookups, u.user_updates

我在家里没有访问SQL Management Studio的权限,但您可以查看存储过程的依赖性(即,
存储过程依赖于这些表,因此可以使用这些索引)

可能会给你一些线索,比如使用
信息\u模式。例程
系统表:

SELECT routine_name, routine_type 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%Employee%'
您可以将此信息填充到临时表中,然后使用临时表查询所使用的索引,查看索引使用情况统计信息


很抱歉,我无法给您提供一个实际示例,只是一个理论示例…

您有中所有语句的执行次数,您可以使用提取计划XML。该计划包含一些细节,比如使用的扫描操作符,因此在这两个操作符之间,您可以根据您的要求补充很多信息。例如,以下查询将显示缓存计划中频繁运行的语句中的IndexScan运算符,这些语句会导致许多逻辑读取:

with xmlnamespaces ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as sp)
select top(100) 
  q.total_logical_reads, q.execution_count
  , x.value(N'@Database', N'sysname') as [Database]
  , x.value(N'@Schema', N'sysname') as [Schema]
  , x.value(N'@Table', N'sysname') as [Table]
  , x.value(N'@Index', N'sysname') as [Index]
  , substring(t.text, q.statement_start_offset/2,   
  case when 0 < q.statement_end_offset then (q.statement_end_offset - q.statement_start_offset)/2
  else len(t.text) - q.statement_start_offset/2 end) as [Statement]
from sys.dm_exec_query_stats q
cross apply sys.dm_exec_query_plan(plan_handle)
cross apply sys.dm_exec_sql_text(sql_handle) as t
cross apply query_plan.nodes(N'//sp:IndexScan/sp:Object') s(x)
where execution_count > 100
order by total_logical_reads desc;
使用xmlnamespace('code>)http://schemas.microsoft.com/sqlserver/2004/07/showplan“作为sp) 选择顶部(100) q、 总逻辑读取数,q.执行数 ,x.value(N'@Database',N'sysname')作为[数据库] ,x.value(N'@Schema',N'sysname')作为[Schema] ,x.value(N'@Table',N'sysname')作为[表] ,x.value(N'@Index',N'sysname')作为[索引] ,子字符串(t.text,q.statement\u start\u offset/2, 当0100 按总逻辑顺序读取描述;
给定索引名,这将返回每个过程的完整定义(在“完整查询”中)以及该过程中使用索引的实际SQL语句(在“查询”中)。注意,它运行得非常慢

declare @indexName nvarchar(255) = N'[IX_Transaction_TypeId_TranId_StatusId]'

;with xmlnamespaces ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as sp)
select 
    n.value(N'@Index', N'sysname') as IndexName,
    replace(t.text, '**', '') as entire_query,
    substring (t.text,(s.statement_start_offset/2) + 1, 
            ((case when s.statement_end_offset = -1 then len(convert(nvarchar(max), t.text)) * 2
        else
            s.statement_end_offset
        end 
        - s.statement_start_offset)/2) + 1) as query,
    p.query_plan
from 
    sys.dm_exec_query_stats as s
    cross apply sys.dm_exec_sql_text(s.sql_handle) as t 
    cross apply sys.dm_exec_query_plan(s.plan_handle) as p 
    cross apply query_plan.nodes('//sp:Object') as p1(n)
where
    n.value(N'@Index', N'sysname') = @indexName

我知道这一点,但如果我有100个存储过程,我不希望逐一检查并手动查找这些信息。我试图找出的是,是否有一个系统表或视图,我可以查询,以找出什么索引被什么procsWell使用,你让我在那里gbn。你想让我重新表述我的问题,还是你理解我想说的话的精神?阿贝,这可能看起来很迂腐,但有很好的理由让你在交流中清楚地了解像这样的技术主题。一个原因是‘你想要正确的答案吗?’嘿,谢谢你提醒戴夫。我用澄清部分更新了我的问题。请让我知道它是否仍然令人困惑。感谢gbn的帮助,我一定会在将来正确地表达我的索引使用问题:)永远不要使用信息\u SCHEMA.ROUTINES。始终使用sys.sql\u模块。例程的定义是nvarchar(4000):你可以找出为什么会出现这种情况。。。