How DBATools can help with performance tuning.
DBATools is well known in the SQL Server community for the ease at which it allows you to automate certain tasks but did you know that DBATools can help with performance tuning your SQL Server. As my job recently changed to have more of a performance tilt, I wanted to investigate which commands would be useful in helping me with performance tuning. It turned out there are quite a few.
Page and row compression is a hidden gem when it comes to performance tuning SQL Server. Simply compressing some large indexes can sometimes be enough on it’s own to get you over the line in terms of performance improvement. With compression, it shouldn’t be a guessing game. SQL Server has built in stored procedures to let you know whether a table or index would benefit from page,row or no compression.
EXEC sp_estimate_data_compression_savings 'dbo', 'DB1', NULL, NULL, 'ROW' ; EXEC sp_estimate_data_compression_savings 'dbo', 'DB1', NULL, NULL, 'PAGE' ;
But if you want to test a whole DB or instance at a time, DBA tools makes this a lot easier.
Test-DbaDbCompression -SqlInstance localhost -Database WideWorldImporters | Select-Object TableName, IndexName, IndexId, PercentScan, PercentUpdate, RowEstimatePercentOriginal, PageEstimatePercentOriginal, CompressionTypeRecommendation, SizeCurrent, SizeRequested, PercentCompression | Out-GridView
Piping to Out-Gridview is optional but I love the way the output is tabulated and easy to read. I use this output to create a list of objects to be compressed. I then do some load testing, before and after the changes and compare the results. This gives me the confidence to roll out the changes to production.
Hint: Having a way of replaying a consistent load and measuring results before and after is essential when performance tuning by making wholesale changes. If you don’t have a way of doing this, I recommend looking into WorkloadTools.
Find unwanted code hints
When I took over a new environment, there was A LOT of blocking. Part of this was down to the code which was in need of optimsation, but it was also due to a lot of hints peppered throughout the stored procedures that made blocking inevitable. I found several examples of REPEATABLE READ and SERIALIZABLE throughout the code base. Asking developers about why we needed this level of isolation, no one thought we did and said this was done by developers who had moved on.
So, what is the easiest way to find every example of REPEATABLE READ in your code base, DBATools of course.
Find-DbaStoredProcedure -SqlInstance SQL123 -Database WideWorldImporters -Pattern 'REPEATABLE READ' | Select-Object * | out-gridview
Just like before, if you can get a replay running that simulates production, then you can measure whether your blocking and response times go down.
Check disk speeds
Knowing that your disks are performing well gives you the confidence to go out and work on your code to seek performance improvements. But if you have slow disks, this can also be a bottleneck. Knowing you have a problem and rectifying it means you can see performance improvements before you have even looked at your indexes or stored procedures.
A common bottleneck can be tempdb, it’s always good to know you have tempdb on high performing disks. (If using Azure VMs, you can utilise the D drive for tempdb)
Test-DBADiskSpeed -SQlInstance SQL123 -Database tempdb | Out-Gridview
Easily install some of the best free community tools around which will help you evaluate and monitor your SQL Server.
# Install the First responder kit from Brent Ozar Unlimited. Includes sp_blitz, sp_blitzcache and sp_blitzIndex which all help with performance tuning. See https://www.brentozar.com/ for more info. Install-DbaFirstResponderKit -SqlInstance SQL123 -Database dba # Installs sp_whoisactive by Adam Machanic which is a priceless tool in terms of evaluating what is running on your instance right now. See http://whoisactive.com/ for more info. Install-DbaWhoIsActive -SqlInstance SQL123 -Database dba # Install the free community monitoring tool SQLWatch. See https://sqlwatch.io/ for more info. Install-DbaSqlWatch -SqlInstance SQL123
A full list of commands can be reviewed on https://dbatools.io/commands/.