sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo encontrar qué procedimientos almacenados están usando qué índices?

Tiene el número de ejecuciones para todas las instrucciones en sys.dm_exec_query_stats y puede extraer el plan XML usando sys.dm_exec_query_plan . El plan contiene detalles como los operadores de escaneo utilizados, por lo que entre estos dos puede inventar mucha información a partir de lo que pide. Por ejemplo, la siguiente consulta le mostrará los operadores de IndexScan en las declaraciones que se ejecutan con frecuencia desde los planes almacenados en caché que provocan muchas lecturas lógicas:

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;