Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come trovare quali stored procedure stanno utilizzando quali indici?

Hai il numero di esecuzioni per tutte le istruzioni in sys.dm_exec_query_stats e puoi estrarre l'XML del piano utilizzando sys.dm_exec_query_plan . Il piano contiene dettagli come gli operatori di scansione utilizzati, quindi tra questi due puoi ricavare molte informazioni da ciò che chiedi. Ad esempio, la query seguente mostrerà gli operatori IndexScan nelle istruzioni eseguite di frequente dai piani memorizzati nella cache che causano molte letture logiche:

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;