script can be used for any database.
script lists all missing index with create statement.
script can be used for any database.
script lists all missing index with create statement.
go
/*
Description:- This Query will provide you detail of missing indexes on a table and also
prepare sql script for new index
Author:- Arun Kumar
Email:- arun_kumar112@yahoo.co.in,arun.kumar@iqor.com
Mobile:- 9811539923
*/SELECT
DISTINCT
@@SERVERNAME AS [ServerName]
, DB_NAME() AS [DatabaseName]
, SCHEMA_NAME([systemObject].[schema_id]) AS [SchemaName]
,[systemObject].Object_ID AS ObjectID
, [systemObject].[name] AS [ObjectName]
, CASE [systemObject].[type]
WHEN 'U' THEN 'Table'
WHEN 'V' THEN 'View'
ELSE 'Unknown'
END AS [ObjectType]
, [MissingIndexDetail].[equality_columns] AS [EqualityColumns]
, [MissingIndexDetail].[inequality_columns] AS [InequalityColumns]
, [MissingIndexDetail].[included_columns] AS [IncludedColumns]
, [MissingIndexGroupState].[user_seeks] AS [ExpectedIndexSeeksByUserQueries]
, [MissingIndexGroupState].[user_scans] AS [ExpectedIndexScansByUserQueries]
, [MissingIndexGroupState].[last_user_seek] AS [ExpectedLastIndexSeekByUserQueries]
, [MissingIndexGroupState].[last_user_scan] AS [ExpectedLastIndexScanByUserQueries]
, [MissingIndexGroupState].[avg_total_user_cost] AS [ExpectedAvgUserQueriesCostReduction]
, [MissingIndexGroupState].[avg_user_impact] AS [ExpectedAvgUserQueriesBenefitPct],
IndexName='[ix_' + tbl.name + N'_'
+ REPLACE(REPLACE(REPLACE(REPLACE(
ISNULL(equality_columns,N'')+
CASE WHEN equality_columns IS NOT NULL AND inequality_columns IS NOT NULL THEN N'_' ELSE N'' END
+ ISNULL(inequality_columns,''),',','')
,'[',''),']',''),' ','_')
+ CASE WHEN included_columns IS NOT NULL THEN N'_includes' ELSE N'' END + N']' ,
IndexCreateScripts=N'CREATE INDEX [ix_' + tbl.name + N'_'
+ REPLACE(REPLACE(REPLACE(REPLACE(
ISNULL(equality_columns,N'')+
CASE WHEN equality_columns IS NOT NULL AND inequality_columns IS NOT NULL THEN N'_' ELSE N'' END
+ ISNULL(inequality_columns,''),',','')
,'[',''),']',''),' ','_')
+ CASE WHEN included_columns IS NOT NULL THEN N'_includes' ELSE N'' END + N'] ON '
+ [statement] + N' (' + ISNULL(equality_columns,N'')
+ CASE WHEN equality_columns IS NOT NULL AND inequality_columns IS NOT NULL THEN N', ' ELSE N'' END
+ CASE WHEN inequality_columns IS NOT NULL THEN inequality_columns ELSE N'' END +
') ' + CASE WHEN included_columns IS NOT NULL THEN N' INCLUDE (' + included_columns + N')' ELSE N'' END
+ N' WITH ('
+ N'FILLFACTOR=80, ONLINE=ON'
+ N')'
+ N';'
FROM
[sys].[dm_db_missing_index_details] AS [MissingIndexDetail]
CROSS APPLY sys.dm_db_missing_index_columns ([MissingIndexDetail].index_handle)
LEFT JOIN [sys].[dm_db_missing_index_groups] AS [MissingIndexGroup]
ON [MissingIndexDetail].[index_handle] = [MissingIndexGroup].[index_handle]
LEFT JOIN [sys].[dm_db_missing_index_group_stats] AS [MissingIndexGroupState]
ON [MissingIndexGroup].[index_group_handle] = [MissingIndexGroupState].[group_handle]
INNER JOIN [sys].[objects] AS [systemObject]
ON [MissingIndexDetail].[object_id] = [systemObject].[object_id]
inner join sys.databases db on [MissingIndexDetail].database_id=db.database_id
inner join sys.tables tbl on [systemObject].object_id=tbl.object_id
WHERE
[MissingIndexDetail].[database_id] = DB_ID() -- Look in the Current Database
AND [systemObject].[type] IN ('U','V') -- Look in Tables & Views
AND [systemObject].[is_ms_shipped] = 0x0 -- Exclude System Generated Objects
--and( tbl.name like '%Accounting%' or tbl.name like '%treasury%') --Add table name for filter
--and [MissingIndexGroupState].[avg_user_impact]>=50; -- filter impact percentage
go