| name | cancel-long-running-queries-and-sessions |
| description | Identify and cancel problematic queries and sessions impacting cluster performance |
| metadata | {"domain":"Cluster Management","bloom_level":"Apply","version":"1.1.0","cockroachdb_version":"v26.1.0+","status":"complete","tested":true} |
Cancel Long-Running Queries and Sessions
Domain: Cluster Management
Bloom's Level: Apply
What This Skill Teaches
You'll learn to identify, investigate, and cancel long-running queries and sessions that impact cluster performance. This includes using SHOW QUERIES and SHOW SESSIONS to find problematic operations, filtering by various criteria (runtime, memory usage, application), and applying graceful or forced cancellation strategies.
When to Use This Skill
- Performance degradation: Cluster experiencing slowdowns or high resource usage
- Runaway queries: Queries consuming excessive memory or CPU time
- Stuck transactions: Long-running transactions blocking other operations
- Application issues: Misbehaving applications creating connection leaks
- Maintenance windows: Clearing active sessions before cluster maintenance
- Resource contention: Identifying queries competing for resources
Core Concepts
Query States
- Executing: Currently running on a node
- Waiting: Queued or blocked by contention
- Idle in transaction: Open transaction with no active query
Session vs Query
- Session: Connection from client to cluster (may have multiple queries)
- Query: Individual SQL statement within a session
- Canceling query: Stops current statement, keeps session alive
- Canceling session: Terminates connection, rolls back transaction
Instructions
1. Identify Long-Running Queries
SHOW QUERIES;
SELECT query_id, node_id, user_name, application_name,
start, query, (now() - start) AS duration
FROM [SHOW CLUSTER QUERIES]
WHERE start < (now() - INTERVAL '1 minute')
ORDER BY start;
SELECT query_id, node_id, application_name, query,
(now() - start) AS duration
FROM [SHOW CLUSTER QUERIES]
WHERE (now() - start) > INTERVAL '30 seconds'
ORDER BY (now() - start) DESC
LIMIT 10;
2. Investigate Query Details
SHOW QUERY 'query-id-here';
SELECT query_id, session_id, application_name,
start, query, (now() - start) AS duration
FROM [SHOW CLUSTER QUERIES]
WHERE query_id = 'query-id-here';
SELECT query_id, session_id, (now() - start) AS duration,
CASE
WHEN (now() - start) > INTERVAL '5 minutes' THEN 'VERY_SLOW'
WHEN (now() - start) > INTERVAL '1 minute' THEN 'SLOW_QUERY'
ELSE 'NORMAL'
END AS status
FROM [SHOW CLUSTER QUERIES]
WHERE query_id = 'query-id-here';
3. Filter Queries by Application or User
SELECT query_id, user_name, start, (now() - start) AS duration, query
FROM [SHOW CLUSTER QUERIES]
WHERE application_name = 'myapp'
AND (now() - start) > INTERVAL '30 seconds';
SELECT query_id, application_name, start, (now() - start) AS duration
FROM [SHOW CLUSTER QUERIES]
WHERE user_name = 'reporting_user'
ORDER BY (now() - start) DESC;
SELECT application_name, count(*) AS query_count,
max(now() - start) AS longest_query
FROM [SHOW CLUSTER QUERIES]
WHERE (now() - start) > INTERVAL '10 seconds'
GROUP BY application_name
ORDER BY query_count DESC;
4. Identify Problematic Sessions
SHOW SESSIONS;
SELECT session_id, node_id, user_name, application_name,
active_queries, last_active_query, session_start
FROM [SHOW CLUSTER SESSIONS]
WHERE active_queries = ''
AND last_active_query != ''
AND (now() - active_query_start) > INTERVAL '5 minutes';
SELECT session_id, application_name, user_name,
active_queries, session_start
FROM [SHOW CLUSTER SESSIONS]
WHERE active_queries != ''
ORDER BY session_start;
SELECT session_id, client_address, user_name,
application_name, active_queries
FROM [SHOW CLUSTER SESSIONS]
WHERE client_address LIKE '10.0.1.%';
5. Cancel Individual Queries
CANCEL QUERY 'query-id-here';
CANCEL QUERY '17d0e0c38db5cc380000000000000001' ON NODE 1;
SELECT query_id FROM [SHOW CLUSTER QUERIES]
WHERE application_name = 'batch_processor'
AND (now() - start) > INTERVAL '2 minutes';
CANCEL QUERY 'query-id-1';
CANCEL QUERY 'query-id-2';
6. Cancel Sessions
CANCEL SESSION 'session-id-here';
CANCEL SESSION '17d0e0c38db5cc380000000000000001' ON NODE 1;
7. Monitor Cancellation Impact
SELECT query_id, (now() - start) AS duration
FROM [SHOW CLUSTER QUERIES]
WHERE query_id = 'cancelled-query-id';
SELECT count(*) AS session_count
FROM [SHOW CLUSTER SESSIONS]
WHERE application_name = 'problematic_app';
SELECT * FROM crdb_internal.node_runtime_info;
Common Patterns
Pattern: Cancel All Queries from Misbehaving Application
SELECT query_id, (now() - start) AS duration, query
FROM [SHOW CLUSTER QUERIES]
WHERE application_name = 'legacy_app';
Pattern: Clear Idle Transactions Before Maintenance
SELECT session_id, user_name, application_name,
active_query_start, last_active_query
FROM [SHOW CLUSTER SESSIONS]
WHERE active_queries = ''
AND last_active_query != ''
AND (now() - active_query_start) > INTERVAL '10 minutes';
CANCEL SESSION 'session-id-1';
CANCEL SESSION 'session-id-2';
Pattern: Emergency Memory Pressure Relief
SELECT query_id, (now() - start) AS duration, application_name,
substring(query, 1, 100) AS query_preview
FROM [SHOW CLUSTER QUERIES]
WHERE (now() - start) > INTERVAL '30 seconds'
ORDER BY (now() - start) DESC;
CANCEL QUERY 'longest-running-query-id';
Pattern: Identify and Cancel Distributed Queries
SELECT query_id, node_id, (now() - start) AS duration
FROM [SHOW CLUSTER QUERIES]
WHERE query LIKE '%FULL SCAN%'
OR query LIKE '%JOIN%'
ORDER BY (now() - start) DESC;
CANCEL QUERY 'distributed-query-id';
Troubleshooting
Query Won't Cancel
Symptom: CANCEL QUERY succeeds but query still appears in SHOW QUERIES
Causes:
- Query in commit/rollback phase (must complete)
- System-level query (cannot be cancelled)
- Network partition preventing cancellation signal
Solutions:
SELECT query_id, (now() - start) AS duration, query
FROM [SHOW CLUSTER QUERIES]
WHERE query_id = 'stuck-query-id';
CANCEL SESSION 'session-id-for-query';
Cannot Identify Query Source
Symptom: Query visible but no clear application_name or user_name
Investigation:
SELECT * FROM [SHOW CLUSTER QUERIES]
WHERE query_id = 'unknown-query-id';
SELECT session_id, client_address, application_name
FROM [SHOW CLUSTER SESSIONS]
WHERE session_id IN (
SELECT session_id FROM [SHOW CLUSTER QUERIES]
WHERE query_id = 'unknown-query-id'
);
Session Immediately Reconnects After Cancel
Symptom: Canceling session but connection pool recreates it
Cause: Application connection pool auto-reconnects
Solution:
- Fix application code or connection pool settings
- Temporarily block at firewall/load balancer level
- Use network policies to rate-limit reconnections
Permission Denied When Canceling
Symptom: User cannot cancel queries from other users
Cause: Insufficient privileges
Solution:
GRANT admin TO username;
Common Mistakes
- Canceling without investigation: Always identify why query is slow before canceling
- Ignoring idle transactions: "Idle in transaction" sessions hold locks and resources
- Canceling critical operations: Be cautious with DDL, backup/restore, changefeeds
- Not monitoring after cancel: Verify queries don't restart or pile up again
- Confusing query_id and session_id: These are different identifiers
- Not checking for retries: Applications may automatically retry cancelled queries
- Canceling during commit: Queries in commit phase cannot be cancelled
Best Practices
-
Set query timeouts: Use statement_timeout cluster setting to auto-cancel slow queries
SET statement_timeout = '5m';
SET CLUSTER SETTING sql.defaults.statement_timeout = '10m';
-
Monitor proactively: Set up alerts for long-running queries before they cause issues
-
Identify patterns: Track which applications/queries frequently need cancellation
-
Document thresholds: Define SLOs for acceptable query runtime
-
Use application_name: Ensure applications set meaningful names for easier filtering
-
Graceful degradation: Cancel queries in order of severity (longest first)
-
Communicate with users: Notify application teams before canceling their queries
-
Test cancellation: Verify applications handle query cancellation gracefully
-
Log cancellations: Keep audit trail of what was cancelled and why
-
Review query plans: Use EXPLAIN to understand why queries are slow
Performance Considerations
SHOW QUERIES and SHOW SESSIONS are lightweight operations
SHOW CLUSTER QUERIES/SESSIONS query all nodes (slightly more expensive)
- Cancellation is immediate but cleanup may take time
- Cancelled queries still consume resources until fully terminated
- Large result sets may take time to abort
Security Considerations
- Only admin users can cancel queries from other users
- Regular users can only cancel their own queries/sessions
- Audit cancellations in security-sensitive environments
- Be cautious canceling queries that may contain sensitive data in progress
Related Skills
- monitor-query-performance: Identify slow queries before they become problematic
- configure-statement-timeout: Set automatic query cancellation thresholds
- analyze-query-execution-plans: Understand why queries run slowly
- manage-connection-pools: Prevent session leaks and connection exhaustion
- monitor-transaction-contention: Identify blocking transactions
- troubleshoot-performance-issues: Systematic approach to cluster slowdowns
- use-cluster-observability-tools: Monitoring dashboards and metrics
- manage-user-privileges: Control who can cancel queries
Additional Resources
Examples
Example 1: Cancel All Queries Older Than 10 Minutes
SELECT query_id, user_name, application_name,
(now() - start) AS duration, substring(query, 1, 100)
FROM [SHOW CLUSTER QUERIES]
WHERE (now() - start) > INTERVAL '10 minutes'
ORDER BY (now() - start) DESC;
CANCEL QUERY '17d0e0c38db5cc380000000000000001';
CANCEL QUERY '17d0e0c38db5cc390000000000000002';
Example 2: Clear All Sessions from Decommissioned Application
SELECT session_id, client_address, session_start
FROM [SHOW CLUSTER SESSIONS]
WHERE application_name = 'old_reporting_app';
CANCEL SESSION 'session-id-1';
CANCEL SESSION 'session-id-2';
CANCEL SESSION 'session-id-3';
Example 3: Emergency Response to Memory Pressure
SELECT query_id, (now() - start) AS duration,
application_name, node_id
FROM [SHOW CLUSTER QUERIES]
ORDER BY (now() - start) DESC
LIMIT 5;
CANCEL QUERY 'query-id-1';
CANCEL QUERY 'query-id-2';
CANCEL QUERY 'query-id-3';
SELECT node_id, used_bytes, available_bytes
FROM crdb_internal.node_runtime_info;