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次?
编辑(再次,在问题更新后):
没有现实的机会。您可以尝试探查器并捕获文本计划。我曾经看到过这个,但它杀死了服务器:需要记录大量文本。嗯嗯:-)
存储过程不使用索引。
存储过程使用表(和索引视图),然后使用索引(或者像上面计算的那样不使用索引)
无论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)