Skip to content

Commit 2b2143c

Browse files
Merge pull request #701 from erikdarlingdata/feature/hi-text-rewrite
sp_QuickieStore: rewrite representative text query to avoid grouping on nvarchar(max)
2 parents 1a13655 + 883c9d3 commit 2b2143c

2 files changed

Lines changed: 80 additions & 46 deletions

File tree

Install-All/DarlingData.sql

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
-- Compile Date: 03/23/2026 17:38:09 UTC
1+
-- Compile Date: 03/23/2026 19:02:42 UTC
22
SET ANSI_NULLS ON;
33
SET ANSI_PADDING ON;
44
SET ANSI_WARNINGS ON;
@@ -36737,7 +36737,7 @@ BEGIN
3673736737
SELECT 'object_name: the stored procedure, function, or trigger this query belongs to, or "Adhoc" for ad hoc SQL' UNION ALL
3673836738
SELECT 'query_sql_text: representative query text (the most-executed variant for this query_hash)' UNION ALL
3673936739
SELECT 'query_plan: the most recent execution plan (XML) for this query_hash' UNION ALL
36740-
SELECT 'top_waits: top 3 Query Store wait categories with total wait time in ms (SQL 2017+ only, NULL on 2016)' UNION ALL
36740+
SELECT 'top_waits: top 3 Query Store wait categories with total wait time in ms (SQL 2017+ with wait stats enabled, omitted otherwise)' UNION ALL
3674136741
SELECT 'query_hash: the query_hash that groups all parameterized variants of the same query' UNION ALL
3674236742
SELECT 'query_count: how many distinct query_ids share this hash (parameterized variants)' UNION ALL
3674336743
SELECT 'plan_count: how many distinct plans exist across all variants. >1 may indicate plan instability.' UNION ALL
@@ -41494,11 +41494,31 @@ SELECT
4149441494
END + N',
4149541495
pw.primary_window,
4149641496
qi.object_name,
41497-
rt.query_sql_text,
41497+
query_sql_text =
41498+
(
41499+
SELECT
41500+
[processing-instruction(query)] =
41501+
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
41502+
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
41503+
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
41504+
rt.query_sql_text COLLATE Latin1_General_BIN2,
41505+
NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''),
41506+
NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''),
41507+
NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''),NCHAR(0),N'''')
41508+
FOR XML
41509+
PATH(N''''),
41510+
TYPE
41511+
),
4149841512
query_plan =
4149941513
TRY_CONVERT(xml, qp.query_plan),
41500-
qw.top_waits,
41501-
s.query_hash,
41514+
' +
41515+
CASE
41516+
WHEN @new = 1
41517+
AND @query_store_waits_enabled = 1
41518+
THEN N'qw.top_waits,
41519+
'
41520+
ELSE N''
41521+
END + N's.query_hash,
4150241522
s.query_count,
4150341523
s.plan_count,
4150441524
qi.query_id_list,
@@ -41832,9 +41852,15 @@ LEFT JOIN #hi_query_identifiers AS qi
4183241852
ON s.query_hash = qi.query_hash
4183341853
LEFT JOIN #hi_primary_window AS pw
4183441854
ON s.query_hash = pw.query_hash
41835-
LEFT JOIN #hi_query_waits AS qw
41855+
' +
41856+
CASE
41857+
WHEN @new = 1
41858+
AND @query_store_waits_enabled = 1
41859+
THEN N'LEFT JOIN #hi_query_waits AS qw
4183641860
ON s.query_hash = qw.query_hash
41837-
OUTER APPLY
41861+
'
41862+
ELSE N''
41863+
END + N'OUTER APPLY
4183841864
(
4183941865
SELECT TOP (1)
4184041866
qsp.query_plan

sp_QuickieStore/sp_QuickieStore.sql

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4241,55 +4241,63 @@ OPTION(RECOMPILE);' + @nc10;
42414241
SELECT
42424242
@sql += N'
42434243
SELECT
4244-
qsq.query_hash,
4244+
ranked.query_hash,
42454245
qsqt.query_sql_text,
4246-
rn =
4247-
ROW_NUMBER() OVER
4248-
(
4249-
PARTITION BY qsq.query_hash
4250-
ORDER BY SUM(qsrs.count_executions) DESC
4251-
)
4252-
FROM ' + @database_name_quoted + N'.sys.query_store_query AS qsq
4253-
JOIN ' + @database_name_quoted + N'.sys.query_store_plan AS qsp
4254-
ON qsq.query_id = qsp.query_id
4255-
JOIN ' + @database_name_quoted + N'.sys.query_store_runtime_stats AS qsrs
4256-
ON qsp.plan_id = qsrs.plan_id
4257-
JOIN ' + @database_name_quoted + N'.sys.query_store_runtime_stats_interval AS qsrsi
4258-
ON qsrs.runtime_stats_interval_id = qsrsi.runtime_stats_interval_id
4259-
JOIN ' + @database_name_quoted + N'.sys.query_store_query_text AS qsqt
4260-
ON qsq.query_text_id = qsqt.query_text_id
4261-
WHERE qsrsi.start_time >= @start_date
4262-
AND qsrsi.start_time < @end_date' + @nc10;
4246+
ranked.rn
4247+
FROM
4248+
(
4249+
SELECT
4250+
qsq.query_hash,
4251+
qsq.query_text_id,
4252+
rn =
4253+
ROW_NUMBER() OVER
4254+
(
4255+
PARTITION BY qsq.query_hash
4256+
ORDER BY SUM(qsrs.count_executions) DESC
4257+
)
4258+
FROM ' + @database_name_quoted + N'.sys.query_store_query AS qsq
4259+
JOIN ' + @database_name_quoted + N'.sys.query_store_plan AS qsp
4260+
ON qsq.query_id = qsp.query_id
4261+
JOIN ' + @database_name_quoted + N'.sys.query_store_runtime_stats AS qsrs
4262+
ON qsp.plan_id = qsrs.plan_id
4263+
JOIN ' + @database_name_quoted + N'.sys.query_store_runtime_stats_interval AS qsrsi
4264+
ON qsrs.runtime_stats_interval_id = qsrsi.runtime_stats_interval_id
4265+
WHERE qsrsi.start_time >= @start_date
4266+
AND qsrsi.start_time < @end_date' + @nc10;
42634267

42644268
/*Same maintenance filter for representative text*/
42654269
IF @include_maintenance = 0
42664270
BEGIN
42674271
SELECT
4268-
@sql += N'AND NOT EXISTS
4269-
(
4270-
SELECT
4271-
1/0
4272-
FROM ' + @database_name_quoted + N'.sys.query_store_query_text AS qsqt2
4273-
WHERE qsqt2.query_text_id = qsq.query_text_id
4274-
AND
4272+
@sql += N' AND NOT EXISTS
42754273
(
4276-
qsqt2.query_sql_text LIKE N''ALTER INDEX%''
4277-
OR qsqt2.query_sql_text LIKE N''ALTER TABLE%''
4278-
OR qsqt2.query_sql_text LIKE N''CREATE%INDEX%''
4279-
OR qsqt2.query_sql_text LIKE N''CREATE STATISTICS%''
4280-
OR qsqt2.query_sql_text LIKE N''UPDATE STATISTICS%''
4281-
OR qsqt2.query_sql_text LIKE N''%SELECT StatMan%''
4282-
OR qsqt2.query_sql_text LIKE N''DBCC%''
4283-
OR qsqt2.query_sql_text LIKE N''(@[_]msparam%''
4284-
OR qsqt2.query_sql_text LIKE N''WAITFOR%''
4285-
)
4286-
)' + @nc10;
4274+
SELECT
4275+
1/0
4276+
FROM ' + @database_name_quoted + N'.sys.query_store_query_text AS qsqt2
4277+
WHERE qsqt2.query_text_id = qsq.query_text_id
4278+
AND
4279+
(
4280+
qsqt2.query_sql_text LIKE N''ALTER INDEX%''
4281+
OR qsqt2.query_sql_text LIKE N''ALTER TABLE%''
4282+
OR qsqt2.query_sql_text LIKE N''CREATE%INDEX%''
4283+
OR qsqt2.query_sql_text LIKE N''CREATE STATISTICS%''
4284+
OR qsqt2.query_sql_text LIKE N''UPDATE STATISTICS%''
4285+
OR qsqt2.query_sql_text LIKE N''%SELECT StatMan%''
4286+
OR qsqt2.query_sql_text LIKE N''DBCC%''
4287+
OR qsqt2.query_sql_text LIKE N''(@[_]msparam%''
4288+
OR qsqt2.query_sql_text LIKE N''WAITFOR%''
4289+
)
4290+
)' + @nc10;
42874291
END;
42884292

42894293
SELECT
4290-
@sql += N'GROUP BY
4291-
qsq.query_hash,
4292-
qsqt.query_sql_text
4294+
@sql += N' GROUP BY
4295+
qsq.query_hash,
4296+
qsq.query_text_id
4297+
) AS ranked
4298+
JOIN ' + @database_name_quoted + N'.sys.query_store_query_text AS qsqt
4299+
ON qsqt.query_text_id = ranked.query_text_id
4300+
WHERE ranked.rn = 1
42934301
OPTION(RECOMPILE);' + @nc10;
42944302

42954303
IF @debug = 1

0 commit comments

Comments
 (0)