Indexes are the most important factor for identifying the relevant data rows quickly. They are used for both identifying modification and data retrieval. Missing Index can have impact on performance. When SQL SERVER runs the queries, it first examines the tables / views and determines which indexes are uses. If these indexes are available then uses them. But if not available then it mark it in cached plan in internal data structure that you can view by using DMV (Dynamic Management View).
To identifying most missing index use following DMVs
|
DMV |
Description |
|
sys.dm_db_missing_index_details |
Contains details of the database/schema/table the missing index relates to, together with how the index usage has been identified in queries (such as equality/inequality). |
|
sys.dm_db_missing_index_group_stats |
Contains details of how often the index would have been used, how it would be used (seek or scan), and a measure of the effectiveness of the index. |
|
sys.dm_db_missing_index_groups |
This is a linking DMV, linking the previous two DMVs together. |
Following query indentify the missing index information.
SET
TRANSACTION isolation
level READ
uncommitted
SELECT
Round(s.avg_total_user_cost
* s.avg_user_impact
*
(
s.user_seeks + s.user_scans
), 0)
AS [Total Cost], d.[statement] AS
[Table Name],
equality_columns,
inequality_columns,
included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [total cost] DESC

Description of the Query
|
Total Cost |
1) avg_total_user_cost => Average cost of the user queries that could be reduced by the index in the group. 2) avg_user_impact => Average percentage benefit that user queries could experience if this missing index group was implemented. The value means that the query cost would on average drop by this percentage if this missing index group was implemented. 3) user_seeks => Number of seeks caused by user queries that the recommended index in the group could have been used for. 4) user_scans => Number of scans caused by user queries that the recommended index in the group could have been used for. |
|
Table Name |
Database Table Name |
|
equality_columns |
list of columns that contribute to equality predicates of the form: table.column =constant_value |
|
inequality_columns |
list of columns that contribute to inequality predicates, for example, predicates of the form: table.column > constant_value Any comparison operator other than "=" expresses inequality. |
|
included_columns |
list of columns needed as covering columns for the query. |
Following Query Create Dynamic Missing Index Script which Total Cost more then 10
PRINT
'Missing Indexes: '
PRINT
'The "improvement_measure" column
is an indicator of the (estimated) improvement that might '
PRINT
'be seen if the index was
created. This is a unitless number, and has meaning only relative '
PRINT 'the same number for other indexes. The measure is a combination of the avg_total_user_cost, '
PRINT 'avg_user_impact, user_seeks, and user_scans columns in sys.dm_db_missing_index_group_stats.'
PRINT ''
PRINT '-- Missing Indexes --'
SELECT CONVERT (varchar, getdate(), 126) AS runtime,
mig.index_group_handle, mid.index_handle,
CONVERT (decimal (28,1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) AS
improvement_measure,
'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle)
+ ' ON ' + mid.statement
+ ' (' + ISNULL (mid.equality_columns,'')
+ CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL
(mid.inequality_columns, '')
+ ')'
+ ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE CONVERT (decimal (28,1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC
PRINT ''
GO

Just Copy and run the Create Index Statement.
CREATE INDEX missing_index_37_36
ON [CadilaReporting].[dbo].[EmpMst] ([dresigndate])
include ([vCompanyCode], [vEmpCode], [vFirstName])

Join the conversation! Your thoughts help the community grow.