功能
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. 执行目标 SQLSELECT * FROM t1 WHERE id = 1;# 3. 刷盘确保日志已写入文件FLUSH SLOW_QUERY_OPTIMIZER_TRACE_LOG;# 4. 查询历史 optimizer trace 记录SELECT timestamp, thread_id, query_time, query, missing_bytesFROM INFORMATION_SCHEMA.SLOW_QUERY_OPTIMIZER_TRACEORDER BY timestamp DESCLIMIT 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 traceFROM INFORMATION_SCHEMA.SLOW_QUERY_OPTIMIZER_TRACEWHERE query LIKE '%t1 WHERE id = 1%'ORDER BY timestamp DESCLIMIT 1\\G
输出示例:
*************************** 1. row ***************************trace: {"steps": [{"join_preparation": {...}}, {"join_optimization": {...}}], ...}1 row in set (0.01 sec)