Skip to content

Commit 10308f1

Browse files
committed
cli: improve debug zip transaction_contention_events query
Previously, this query often timed out with errors like "memory budget exceeded" and "query execution canceled due to statement timeout." This was happening because the query needed to deduplicate all the rows returned after performing two left joins on system.statement_statistics. This table is denormalized, meaning many rows are returned for every row joined. To improve this query, CTEs are used to first create distinct (statement_fingerprint, query) and (transaction_fingerprint, queries) tables. Then, transaction_contention_events is joined onto those tables. This reduces the amount of deduplication required, improving performance. Fixes: CRDB-45216 Epic: none Release note (cli change): Improves the performance of the debug zip query that collects transaction_contention_events data, reducing the chances of "memory budget exceeded" or "query execution canceled due to statement timeout" errors.
1 parent 5300725 commit 10308f1

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

pkg/cli/zip_table_registry.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -550,26 +550,37 @@ var zipInternalTablesPerCluster = DebugZipTableRegistry{
550550
},
551551
"crdb_internal.transaction_contention_events": {
552552
customQueryUnredacted: `
553+
with fingerprint_queries as (
554+
SELECT distinct fingerprint_id, metadata->> 'query' as query
555+
FROM system.statement_statistics
556+
),
557+
transaction_fingerprints as (
558+
SELECT distinct fingerprint_id, transaction_fingerprint_id
559+
FROM system.statement_statistics
560+
),
561+
transaction_queries as (
562+
SELECT tf.transaction_fingerprint_id, array_agg(fq.query) as queries
563+
FROM fingerprint_queries fq
564+
JOIN transaction_fingerprints tf on tf.fingerprint_id = fq.fingerprint_id
565+
GROUP BY tf.transaction_fingerprint_id
566+
)
553567
SELECT collection_ts,
554568
contention_duration,
555569
waiting_txn_id,
556570
waiting_txn_fingerprint_id,
557571
waiting_stmt_fingerprint_id,
558-
s.metadata ->> 'query' AS waiting_stmt_query,
572+
fq.query AS waiting_stmt_query,
559573
blocking_txn_id,
560574
blocking_txn_fingerprint_id,
561-
array_agg(distinct ss.metadata ->> 'query') AS blocking_txn_queries_unordered,
575+
tq.queries AS blocking_txn_queries_unordered,
562576
contending_pretty_key,
563577
index_name,
564578
table_name,
565579
database_name
566580
FROM crdb_internal.transaction_contention_events
567-
LEFT JOIN system.statement_statistics AS s ON waiting_stmt_fingerprint_id = s.fingerprint_id
568-
LEFT JOIN system.statement_statistics AS ss ON ss.transaction_fingerprint_id = blocking_txn_fingerprint_id
569-
WHERE ss.transaction_fingerprint_id != '\x0000000000000000' AND s.fingerprint_id != '\x0000000000000000'
570-
GROUP BY collection_ts, contention_duration, waiting_txn_id, waiting_txn_fingerprint_id, blocking_txn_id,
571-
blocking_txn_fingerprint_id, waiting_stmt_fingerprint_id, contending_pretty_key, s.metadata ->> 'query',
572-
index_name, table_name, database_name
581+
LEFT JOIN fingerprint_queries fq ON fq.fingerprint_id = waiting_stmt_fingerprint_id
582+
LEFT JOIN transaction_queries tq ON tq.transaction_fingerprint_id = blocking_txn_fingerprint_id
583+
WHERE fq.fingerprint_id != '\x0000000000000000' AND tq.transaction_fingerprint_id != '\x0000000000000000'
573584
`,
574585
customQueryUnredactedFallback: `
575586
SELECT collection_ts,

0 commit comments

Comments
 (0)