Advertisement
chadbaldwin

Find Unused Indexes

Feb 3rd, 2023
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 3.06 KB | Source Code | 0 0
  1. ------------------------------------------------------------------------------
  2.  
  3. ------------------------------------------------------------------------------
  4. -- Get all cached plans - parse out statistics used
  5. ------------------------------------------------------------------------------
  6. DROP TABLE IF EXISTS #tmpStatsUsed; --SELECT * FROM #tmpStatsUsed;
  7.  
  8. WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS x)
  9. SELECT x.plan_handle, x.TableName, x.SchemaName, x.DatabaseName, x.StatName
  10. INTO #tmpStatsUsed
  11. FROM (
  12.     SELECT cp.plan_handle
  13.         , TableName     = x.n.value('(./@Table)[1]', 'nvarchar(128)')
  14.         , SchemaName    = x.n.value('(./@Schema)[1]', 'nvarchar(128)')
  15.         , DatabaseName  = x.n.value('(./@Database)[1]', 'nvarchar(128)')
  16.         , StatName      = x.n.value('(./@Statistics)[1]', 'nvarchar(128)')
  17.     FROM sys.dm_exec_cached_plans cp
  18.         CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
  19.         CROSS APPLY qp.query_plan.nodes('/x:ShowPlanXML/x:BatchSequence/x:Batch/x:Statements/x:StmtSimple/x:QueryPlan/x:OptimizerStatsUsage/x:StatisticsInfo') x(n)
  20. ) x
  21. WHERE x.DatabaseName NOT IN ('[tempdb]','[master]','[msdb]')
  22.     AND x.SchemaName NOT IN ('[sys]')
  23. --  AND x.StatName NOT LIKE '\[\_WA\_Sys\_%' ESCAPE '\';
  24. ------------------------------------------------------------------------------
  25.  
  26. ------------------------------------------------------------------------------
  27. -- Get all indexes, usage data, statistics info, etc
  28. ------------------------------------------------------------------------------
  29. WITH cte_unique_stats AS (
  30.     SELECT TableName, SchemaName, DatabaseName, StatName
  31.     FROM #tmpStatsUsed
  32.     GROUP BY TableName, SchemaName, DatabaseName, StatName
  33. )
  34. SELECT s.[name]
  35.     , stats_last_updated = sp.last_updated
  36.     , i.[type_desc], i.is_unique, i.is_primary_key, i.is_unique_constraint
  37.     , i.fill_factor, i.is_disabled, i.has_filter, i.filter_definition
  38.     , total_reads = COALESCE(ius.user_seeks,0) + COALESCE(ius.user_scans,0) + COALESCE(ius.user_lookups,0)
  39.     , total_writes = ius.user_updates
  40.     , last_read  = lr.last_read
  41.     , last_write = ius.last_user_update
  42.     , x.DatabaseName, x.SchemaName, x.TableName
  43. FROM sys.stats s
  44.     CROSS APPLY sys.dm_db_stats_properties(s.[object_id], s.stats_id) sp
  45.     LEFT JOIN sys.indexes i ON i.[object_id] = s.[object_id] AND i.[name] = s.[name]
  46.     LEFT JOIN sys.dm_db_index_usage_stats ius ON ius.[object_id] = i.[object_id] AND ius.index_id = i.index_id AND ius.database_id = DB_ID()
  47.     CROSS APPLY (SELECT last_read = MAX(x.last_read) FROM (VALUES (ius.last_user_seek),(ius.last_user_scan),(ius.last_user_lookup)) x(last_read)) lr
  48.     LEFT JOIN cte_unique_stats x ON x.StatName = QUOTENAME(s.[name]) AND x.TableName = QUOTENAME(OBJECT_NAME(s.[object_id])) AND x.DatabaseName = QUOTENAME(DB_NAME())
  49. WHERE OBJECT_NAME(s.[object_id]) = 'SomeTableName'
  50.     AND s.auto_created = 0;
  51. ------------------------------------------------------------------------------
  52.  
  53. ------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement