Azure SQL performance tuning

Publish date: 30 Sep 2021
Tags: software, tools

After recently migrating an application from on-premises to Azure, I have been keeping a close eye on its performance.

The application uses Azure SQL. The Azure portal puts forth recommendations to tune the database e.g. create new indices or drop duplicates. That works well.

However I found another SQL query, which provides more recommendations

This site ‘Tune your database’ Tune applications and databases for performance in Azure SQL Database and Azure SQL Managed Instance provided some useful guidance.

Running this query on the ‘Master’

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 AS mig
   INNER JOIN sys.dm_db_missing_index_group_stats AS migs
      ON migs.group_handle = mig.index_group_handle
   INNER JOIN sys.dm_db_missing_index_details AS mid
      ON mig.index_handle = mid.index_handle
 ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

provides a suggestion for an index creation

CREATE INDEX missing_index_5006_5005 ON [dbo].[missingindex] ([col2])

It also provides a numeric value as an indication of improvement. You can check the before and after Query path as well. I’ve tried this on a database I was working on and could see performance jump.

Note to self: some indexes might take 30-40 mins for creation; so best run after hours :)