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):你可以找出为什么会出现这种情况。。。