Find Missing Indexes before going into productionFind missing indexes the right way! First of all, finding a missing index is not a rocket science. Always find and create missing indexes before you deploy the code to the production environment. DBA’s and engineers try their best to keep the database in a good state by defragging indexes, updating statistics and by performing various other database operation to improve query performance. However, to find missing indexes is not as easy as querying a simple table or executing a stored procedure. Furthermore, many clients always complain about poorly performing queries. This is probably one of the top 10 issues reported by clients. And probably most of the query performance issues stem from missing indexes. Therefore, in this article, we will look at how to find missing indexes.
Find and create any missing indexesNo matter how powerful your server is, with large amounts of data, it is even more important to make sure your queries are tuned and that the underlying tables have proper indexes to help boost query performance. Therefore, the below script provides you with a way to find missing indexes for a specific database and also helps you with exact commands to create those missing indexes. You can automate this script to check across all your user databases on a production server. Finally, this script helps answer your question on how to find missing indexes. This is a very useful and most accurate and noteworthy script that can be used for identifying and creating missing indexes.
SQL Server Best Practices Script provided by: HTTPS://SQLOPS.COM The Most Advanced Risk and Health Audit for Production Databases
SELECT UPPER(DB_Name()) as 'DATABASE', Object_Name(SQLOPS_MsgIdxDetails.object_id) as 'OBJECT NAME', Schema_Name(SQLOPS_SysObj.schema_id) as 'SCHEMA NAME', 'CREATE INDEX '+DB_Name()+'_SQLOPS_'+ Object_Name(SQLOPS_MsgIdxDetails.object_id)+'_' + CONVERT (varchar, SQLOPS_MsgIdxGrp.index_group_handle) + '_' + CONVERT (varchar, SQLOPS_MsgIdxDetails.index_handle) + ' ON ' + SQLOPS_MsgIdxDetails.statement + ' (' + ISNULL (SQLOPS_MsgIdxDetails.equality_columns,'') + CASE WHEN SQLOPS_MsgIdxDetails.equality_columns IS NOT NULL AND SQLOPS_MsgIdxDetails.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL (SQLOPS_MsgIdxDetails.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + SQLOPS_MsgIdxDetails.included_columns + ');', '') AS 'CREATE INDEX COMMAND', --Online Index will work only if you have Enterprise edition Cast(round(SQLOPS_MsgIdxGrpStats.avg_total_user_cost,2) as varchar)+'%' as 'ESTIMATED CURRENT COST', Cast(SQLOPS_MsgIdxGrpStats.avg_user_impact as varchar)+'%' as 'CAN BE IMPROVED', SQLOPS_MsgIdxGrpStats.last_user_seek as 'LAST USER SEEK', 'SCRIPT PROVIDED BY HTTPS://SQLOPS.COM' as 'CREDITS' FROM sys.dm_db_missing_index_groups AS SQLOPS_MsgIdxGrp INNER JOIN sys.dm_db_missing_index_group_stats AS SQLOPS_MsgIdxGrpStats ON SQLOPS_MsgIdxGrpStats.group_handle = SQLOPS_MsgIdxGrp.index_group_handle INNER JOIN sys.dm_db_missing_index_details AS SQLOPS_MsgIdxDetails ON SQLOPS_MsgIdxGrp.index_handle = SQLOPS_MsgIdxDetails.index_handle INNER JOIN sys.objects as SQLOPS_SysObj ON SQLOPS_MsgIdxDetails.object_id = SQLOPS_SysObj.object_id ORDER BY 4 desc*Note: Most of the numbers are estimated Database – Name of the database where indexes are missing Object Name – Name of the object on which the index is missing Schema Name – Name of the schema that owns the object Create Index Command – Command to create missing indexes Estimated Current Cost – The current cost of the query performance with index missing. Can be improved – Percentage of improvement as a result of creating the missing index. Last User Seek – Date and time the query last fetched the data
Note: Above practice is just one of the several thousands of audit checks performed by SQLOPS Risk and Health Assessment for Production Databases. Your investment is worth every penny! 100% risk-free with the money back guarantee. Credits: https://sqlops.com/sql-server-risk-assessment/