SQL Server Query Store: Usability Soft Spots -- Part 2
https://sql-sasquatch.blogspot.com/2019/06/sql-server-query-store-usability-soft_16.html
~~~~
For now, I'm working with a Developer Edition SQL Server 2019 CTP 3.0 installation, on my laptop.
No global trace flags enabled. Pretty vanilla.
OK, let's create a database just for this series of blog posts. No tricks up my sleeve, enable Query Store out the gate, change QUERY_CAPTURE_MODE from default AUTO to ALL, DATA_FLUSH_INTERVAL_SECONDS = 60 and INTERVAL_LENGTH_MINUTES = 1 because these will be pretty quick tests.
USE [master] GO CREATE DATABASE [surprise_plan] ON PRIMARY ( NAME = N'surprise_plan', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.CTP_3_0__2019\MSSQL\DATA\surprise_plan.mdf' , SIZE = 139264KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ) LOG ON ( NAME = N'surprise_plan_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.CTP_3_0__2019\MSSQL\DATA\surprise_plan_log.ldf' , SIZE = 270336KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB ) WITH CATALOG_COLLATION = DATABASE_DEFAULT GO ALTER DATABASE [surprise_plan] SET MULTI_USER GO ALTER DATABASE [surprise_plan] SET QUERY_STORE = ON GO ALTER DATABASE [surprise_plan] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), DATA_FLUSH_INTERVAL_SECONDS = 60, INTERVAL_LENGTH_MINUTES = 1, MAX_STORAGE_SIZE_MB = 1000, QUERY_CAPTURE_MODE = ALL, SIZE_BASED_CLEANUP_MODE = AUTO) GO ALTER DATABASE [surprise_plan] SET READ_WRITE GO
Now let's create stored procedure [surprise_plan1test] for some fun. Nothing too clever here. A query is executed against query store as dynamic SQL. Do it as dynamic SQL so the offset is predictable and it always matches to the same Query Store query_id as long as context_settings_id stays the same.
USE [surprise_plan] GO CREATE OR ALTER PROCEDURE [dbo].[surprise_plan1test] @max_reps INT AS SET NOCOUNT ON DECLARE @ij INT = 0, @query_count INT, @sqlcmd2 NVARCHAR(MAX), @sqlcmd NVARCHAR(MAX) = 'SELECT /*surprise1test*/ qsq.query_id, qsq.query_hash, qsp.plan_id, qsp.query_plan_hash, qsrs.runtime_stats_id, r_last_execution_time = MAX(qsrs.last_execution_time), r_count_executions = SUM(qsrs.count_executions) INTO ##results FROM sys.query_store_runtime_stats qsrs JOIN sys.query_store_plan qsp ON qsrs.plan_id = qsp.plan_id JOIN sys.query_store_query qsq ON qsp.query_id = qsq.query_id JOIN sys.query_store_query_text qsqt ON qsq.query_text_id = qsqt.query_text_id WHERE qsqt.query_sql_text LIKE ''%surprise1test%'' GROUP BY qsq.query_id, qsq.query_hash, qsp.plan_id, qsp.query_plan_hash, qsrs.runtime_stats_id ORDER BY qsrs.runtime_stats_id DESC, r_last_execution_time DESC;' SELECT @query_count = COUNT(*) FROM sys.query_store_query; WHILE @ij < @max_reps BEGIN DROP TABLE IF EXISTS ##results; DBCC FREEPROCCACHE WITH no_infomsgs; EXEC (@sqlcmd); SET @sqlcmd2 = 'SELECT TOP (1) * INTO #tmp FROM SYS.QUERY_STORE_RUNTIME_STATS WHERE runtime_stats_interval_id = ' + CONVERT(NVARCHAR(10), @query_count + @ij) + '; DROP TABLE IF EXISTS #tmp;' EXEC (@sqlcmd2); EXEC (@sqlcmd2); SET @ij = @ij +1; END SELECT * FROM ##results ORDER BY runtime_stats_id DESC;
EXEC [dbo].[surprise_plan1test] @max_reps = 1600
All right. Let's head over to the Query Store activities. Since I know I'm interested in query_id 4, that's the one I'll pull up.
Yeah. That's a lotta plans in the right-hand legend. 22 of them. In a not very helpful order. In fact... though I've tried to figure it out, I don't know what type of order is used for that right-hand legend. It's not chronological. It's not based on duration which is the metric displayed by the graph. I dunno.
Usually with a few more executions of query_id 4 and a few refreshes of this activity, the right-legend becomes sorted in descending plan_id from top-to-bottom. And that's pretty durable. But sometimes it switches back to this nonsensical (to me) ordering.
Got plenty more to show but I wanted to keep this blog post short as an introduction to what I'd be working with.
In the field, I see this quite often - a query_id with over 20 plans that show up in the Tracked Queries activity. And the unhelpful ordering of plans in the right-hand legend, while a minor and fleeting inconvenience, is usability soft spot number 1.
For an update to the repro code and the next step in looking at Query Store Usability Soft Spots continue at...
SQL Server Query Store: Usability Soft Spots -- Part 2
https://sql-sasquatch.blogspot.com/2019/06/sql-server-query-store-usability-soft_16.html
Thanks for reading!
Ciao!!
Q
Agreed! I've been missing the grid mode in the tracked queries, and your posted finally prompted me to open a suggestion for it:
ReplyDeletehttps://feedback.azure.com/forums/908035-sql-server/suggestions/37927969-add-grid-mode-to-query-store-tracked-queries
Upvote please :)
Upvoted!
Delete