Captain, Captain
Third party monitoring tools are in rough shape these days. That’s all I’m gonna say about the situation. I get enough letters from lawyers on account of my BTS fanfic sites.
With that out of the way, let’s talk about something you can do to get a handle on which queries are having problems: Enable Query Store.
You can do that using this command:
ALTER DATABASE [YourDatabase] SET QUERY_STORE ( OPERATION_MODE = READ_WRITE, MAX_STORAGE_SIZE_MB = 1024, QUERY_CAPTURE_MODE = AUTO );
The reason I use this command specifically us because it will override some bad defaults that have been corrected over various service packs and cumulative updates.
You know what I hate doing? Stopping to look at which service packs and cumulative updates fixed certain Query Store defaults.
The important things that this script does is:
- Turn on Query Store
- Give it a decent amount of space to store data in
- Not capture every single tiny little query that runs
What a nice setup.
Okay, Now What?
Once Query Store is enabled, assuming the goal is to track down and solve performance problems, the easiest way to start digging in is the GUI.
I usually go into Top Resource Consuming Queries, then look at what used the most average CPU over the last week.
This view won’t tell you everything of course, but it’s a good starting place.
Okay, But I Need More
The GUI itself right now doesn’t allow for much beyond showing you the top whatever by whatever for whenever. If you want to search through Query Store data for specific plan or query IDs, procedure names, or query text, you’ll need to use my free script sp_QuickieStore.
To get you started, here are a bunch of example commands:
--Get help! EXEC dbo.sp_QuickieStore @help = 1; --Find top 10 sorted by memory EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @sort_order = 'memory', @top = 10; --Search for specific query_ids EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @top = 10, @include_query_ids = '13977, 13978'; --Search for specific plan_ids EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @sort_order = 'memory', @top = 10, @start_date = '20210320', @include_plan_ids = '1896, 1897'; --Ignore for specific query_ids EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @top = 10, @ignore_query_ids = '13977, 13978'; --Ignore for specific plan_ids EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @sort_order = 'memory', @top = 10, @start_date = '20210320', @ignore_plan_ids = '1896, 1897'; --Search for queries within a date range EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @sort_order = 'memory', @top = 10, @start_date = '20210320', @end_date = '20210321'; --Search for queries with a minimum execution count EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @top = 10, @execution_count = 10; --Search for queries over a specific duration EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @top = 10, @duration_ms = 10000; --Search for a specific stored procedure EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @procedure_name = 'top_percent_sniffer'; --Search for specific query tex EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @query_text_search = 'WITH Comment' --Use expert mode to return additional columns EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @sort_order = 'memory', @top = 10, @expert_mode = 1; --Use format output to add commas to larger numbers EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @sort_order = 'memory', @top = 10, @format_output = 1; --Use wait filter to search for queries responsible for high waits EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @wait_filter = 'memory', @sort_order = 'memory'; --Troubleshoot performance EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @troubleshoot_performance = 1; --Debug dynamic SQL and temp table contents EXEC dbo.sp_QuickieStore @database_name = 'StackOverflow2013', @debug = 1;
Thanks for reading!
Going Further
If this is the kind of SQL Server stuff you love learning about, you’ll love my training. I’m offering a 75% discount to my blog readers if you click from here. I’m also available for consulting if you just don’t have time for that and need to solve performance problems quickly.