帮你快速理解、总结文档立即下载

SLOW_QUERY_OPTIMIZER_TRACE

最近更新时间:2026-08-20 15:23:32
我的收藏

功能

SLOW_QUERY_OPTIMIZER_TRACE 视图用于查询已持久化到日志文件的慢查询优化器追踪(optimizer trace)记录。当 SQL 执行耗时超过 long_query_time 阈值,且会话已开启 slow_query_optimizer_trace 时,系统会将该 SQL 的 optimizer trace 异步写入日志文件。通过本视图可查询历史记录,便于事后排查优化器决策问题。
该视图基于 DuckDB 实现,通过读取 <datadir>/optimizer_trace/ 目录下的 NDJSON 日志文件返回结果。查询前建议先执行 FLUSH SLOW_QUERY_OPTIMIZER_TRACE_LOG 确保内存缓冲区中的日志已刷盘。

适用版本

TDSQL Boundless V21.6.4.0及以上版本。

字段说明

字段名
类型
描述
timestamp
TIMESTAMP
SQL 执行的时间戳。
thread_id
BIGINT UNSIGNED
执行该 SQL 的线程 ID。
txid
BIGINT UNSIGNED
执行该 SQL 的事务 ID。
trace_id
BIGINT UNSIGNED
该次 optimizer trace 的唯一标识 ID。
user
VARCHAR
执行该 SQL 的用户名。
host
VARCHAR
执行该 SQL 的客户端主机信息。
schema_name
VARCHAR
执行该 SQL 时所在的数据库名。
query_time
VARCHAR
SQL 执行耗时(秒)。
lock_time
VARCHAR
SQL 执行期间等待锁的耗时(秒)。
rows_sent
BIGINT UNSIGNED
该 SQL 返回给客户端的行数。
rows_examined
BIGINT UNSIGNED
该 SQL 在存储引擎层扫描的行数。
rows_affected
BIGINT UNSIGNED
该 SQL 影响(插入、更新、删除)的行数。
bytes_sent
BIGINT UNSIGNED
该 SQL 返回给客户端的字节数。
rpc_time
VARCHAR
该 SQL 执行期间 RPC 通信的总耗时(秒),仅 Proxy 场景有意义。
tdstore_rpc_time
VARCHAR
该 SQL 执行期间与存储引擎交互的 RPC 总耗时(秒)。
tdstore_lock_time
VARCHAR
该 SQL 执行期间在存储引擎层等待锁的耗时(秒)。
store_real_exec_time
VARCHAR
该 SQL 在存储引擎层的实际执行耗时(秒)。
rpc_cntl_retry_delay_time
VARCHAR
该 SQL 执行期间因 RPC 重试导致的延迟耗时(秒)。
last_errno
BIGINT UNSIGNED
该 SQL 执行返回的最后错误码,0表示无错误。
killed
BIGINT UNSIGNED
该 SQL 是否被 KILL 中断,0表示未被中断。
is_proxy
BIGINT UNSIGNED
该 SQL 是否通过 Proxy 路由执行,1表示是,0表示否。
executor
VARCHAR
Proxy 场景下执行该 SQL 的 executor 标识;本地执行的 SQL 为空字符串。
optimizer_trace_enabled
BIGINT UNSIGNED
是否成功收集了 optimizer trace,1表示已收集,0表示未收集。
missing_bytes
BIGINT UNSIGNED
optimizer trace 因内存限制被截断的字节数,0表示未截断。
missing_priv
BIGINT UNSIGNED
是否因权限不足导致 trace 不可见,1表示不可见,0表示可见。
query
TEXT
执行该 SQL 的完整文本。
trace
JSON
完整的 optimizer trace 内容(JSON 格式)。当 trace 因内存限制被截断时,该字段为截断后的字符串。
说明:
trace 字段为 JSON 类型。当 optimizer trace 因 optimizer_trace_max_mem_size 限制被截断时,missing_bytes 大于0,trace 字段为截断后的字符串而非完整 JSON。
missing_priv 为1时,表示当前用户权限不足,trace 字段不可见。
通过 Proxy 路由执行的 SQL,is_proxy 为1,executor 字段包含 executor 标识,query 为 Proxy 侧 SQL 文本,trace 来自 executor 侧。

示例

# 1. 开启慢查询 optimizer trace 收集,并设置慢查询阈值为 0(确保所有 SQL 都落日志)
SET SESSION long_query_time = 0;
SET SESSION slow_query_optimizer_trace = ON;

# 2. 执行目标 SQL
SELECT * FROM t1 WHERE id = 1;

# 3. 刷盘确保日志已写入文件
FLUSH SLOW_QUERY_OPTIMIZER_TRACE_LOG;

# 4. 查询历史 optimizer trace 记录
SELECT timestamp, thread_id, query_time, query, missing_bytes
FROM INFORMATION_SCHEMA.SLOW_QUERY_OPTIMIZER_TRACE
ORDER BY timestamp DESC
LIMIT 10;
输出示例:
+---------------------+-----------+------------+--------------------------------+---------------+
| timestamp | thread_id | query_time | query | missing_bytes |
+---------------------+-----------+------------+--------------------------------+---------------+
| 2026-07-20 10:30:15 | 42 | 0.000321 | SELECT * FROM t1 WHERE id = 1 | 0 |
+---------------------+-----------+------------+--------------------------------+---------------+
1 row in set (0.01 sec)
# 查看完整 optimizer trace 内容
SELECT trace
FROM INFORMATION_SCHEMA.SLOW_QUERY_OPTIMIZER_TRACE
WHERE query LIKE '%t1 WHERE id = 1%'
ORDER BY timestamp DESC
LIMIT 1\\G
输出示例:
*************************** 1. row ***************************
trace: {"steps": [{"join_preparation": {...}}, {"join_optimization": {...}}], ...}
1 row in set (0.01 sec)