如何查找存储过程正在使用哪些索引?

Abe*_*ler 8 t-sql sql-server sql-server-2005

我试图确定我的数据库中不再使用哪些索引.我使用以下查询运气很好:

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
Run Code Online (Sandbox Code Playgroud)

我现在想要找到的是存储过程导致上述查询报告的搜索,扫描和查找.此信息是否存储在系统视图/表中?

澄清

正如gbn指出存储过程不直接使用索引,它使用一个使用索引的表.以下是我希望澄清我在这里要问的内容的解释.

我是否可以确定导致使用上述索引的SQL运行情况?例如,如果报告的其中一个索引有10个User_Seeks,那么是否可以确定exec sp_1导致该使用7次并exec sp_2导致该使用3次?

gbn*_*gbn 2

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

没有现实的机会。您可以尝试探查器并捕获文本计划。我曾经看到过这个,但它杀死了服务器:需要记录大量文本。嗯嗯:-)

存储过程不使用索引。

存储过程使用表(和索引视图),然后使用索引(或者像上面计算的那样不使用索引)

无论SELECT col1, col2 FROM myTable WHERE col2 = 'foo' ORDER BY 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
Run Code Online (Sandbox Code Playgroud)

  • 安倍,这可能看起来很迂腐,但对于像这样的技术主题进行清晰的沟通是有充分理由的。原因之一是“你想要正确的答案吗?” (3认同)