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

PROXY_DECISION

最近更新时间:2026-08-18 19:12:07
我的收藏

功能

INFORMATION_SCHEMA.PROXY_DECISION 用于展示 当前会话内最近若干条 SQL 语句的代理路由决策追踪信息。当一条 SQL 进入计算节点后,系统会在派发预检、Prepare 之前、Prepare 之后三个阶段对该语句进行代理可行性判定,并最终决定是直接代理到远端节点执行,还是回退到本节点执行。视图按时序记录每一条语句的决策最终动作以及完整的判定路径,便于诊断 SQL 路由不符合预期、代理被拒绝、代理执行失败等问题。
该视图为会话级视图,每个会话独立保留各自的决策历史,不同会话之间的数据互不可见。视图的数据采集与保留行为受以下系统变量控制:
tdsql_enable_proxy_decision:是否开启决策追踪,默认 OFF
tdsql_proxy_decision_history_size:单个会话最多保留的决策行数,默认 10
tdsql_proxy_decision_max_mem_size:单条决策记录允许占用的最大字节数,默认 1048576(1 MB)。
说明:
会话级视图查询本身不会被记录为一条新的代理决策。仅当 tdsql_enable_proxy_decisionON 时,新执行的 SQL 才会写入该视图;将该变量从 ON 切换为 OFF 会清空当前会话的历史记录。

支持版本

适用于 TDSQL Boundless V21.6.3.0 及以上版本。

字段说明

字段名
数据类型
说明
SEQ
bigint unsigned
当前会话内的决策序号,按 SQL 进入计算节点的时间顺序单调递增。结合 ORDER BY SEQ DESC 可获取最近一条记录。
QUERY
varchar(65535)
被追踪的 SQL 语句原文。语句长度受 tdsql_proxy_decision_max_mem_size 限制,超出时会被截断。
FINAL_ACTION
varchar(64)
该 SQL 的最终路由动作,取值如下:
proxy_remote:成功代理到远端节点执行。
exec_in_this_node:在当前节点本地执行。
fallback_to_local:原本判定为代理执行,但因故回退到本节点执行。
error_before_proxy:在进入代理前发生错误。
error:代理过程中发生错误。
TRACE
varchar(65535)
完整的代理决策路径,使用 JSON 文本格式表达。包含 phases 数组与 final 对象两部分:
phases:决策阶段数组,每个阶段对象由 phase 字段标识所处阶段(取值为 dispatch_precheckbefore_preparepost_prepare),steps 字段记录该阶段触发的判定步骤;每个步骤包含 stage(判定项名称)、outcome(判定结果,如 accept / reject / defer / choose / remote)、cause(判定原因)以及可选的 detail(补充信息)。
final:最终决策对象,包含 action(同 FINAL_ACTION 列)和 reason(最终动作产生的原因)。
当单条记录超过 tdsql_proxy_decision_max_mem_size 限制时,TRACE 内容会被安全截断,但仍保证返回的字符串是合法 JSON。
MISSING_BYTES_BEYOND_MAX_MEM_SIZE
int unsigned
tdsql_proxy_decision_max_mem_size 限制而被截断丢弃的字节数。值为 0 表示当前记录未发生截断;非 0 表示已发生截断,可适当调大 tdsql_proxy_decision_max_mem_size 以保留完整 TRACE。

示例

示例 1:开启决策追踪,并查询最近一条 SQL 的最终动作与决策路径。
SET SESSION tdsql_enable_proxy = ON;
SET SESSION tdsql_enable_proxy_decision = ON;
SELECT /*+ PROXY(1) */ SUM(v) FROM t1;
SELECT * FROM information_schema.PROXY_DECISION ORDER BY SEQ DESC LIMIT 1\\G
输出示例:
*************************** 1. row ***************************
SEQ: 12
QUERY: SELECT /*+ PROXY(1) */ SUM(v) FROM t1
FINAL_ACTION: proxy_remote
TRACE: {"phases": [{"phase": "dispatch_precheck", "steps": [{"stage": "can_proxy_in_dispatch", "outcome": "defer", "cause": "regular_dml_deferred_to_prepare"}]}, {"phase": "before_prepare", "steps": [{"stage": "can_proxy_sql_property", "outcome": "accept", "cause": "hint_node_id_forced"}]}, {"phase": "post_prepare", "steps": [{"stage": "proxy_if_possible", "outcome": "choose", "cause": "initiative_proxy"}, {"stage": "determine_executor_node", "outcome": "choose", "cause": "route_found", "detail": "node_id=1"}, {"stage": "prepare_proxy_transaction", "outcome": "choose", "cause": "proxy_transaction_prepared", "detail": "node_id=1"}, {"stage": "proxy_query", "outcome": "remote", "cause": "proxy_remote"}]}], "final": {"action": "proxy_remote", "reason": "proxy_remote"}}
MISSING_BYTES_BEYOND_MAX_MEM_SIZE: 0
示例 2:诊断未按预期代理的 SQL,定位被拒原因。
SET SESSION tdsql_enable_proxy = ON;
SET SESSION tdsql_enable_proxy_decision = ON;
/*## broadcast */ SELECT COUNT(*) FROM t1;
SELECT FINAL_ACTION, TRACE
FROM information_schema.PROXY_DECISION
ORDER BY SEQ DESC LIMIT 1\\G
输出示例:
*************************** 1. row ***************************
FINAL_ACTION: exec_in_this_node
TRACE: {"phases": [{"phase": "dispatch_precheck", "steps": [{"stage": "can_proxy_in_dispatch", "outcome": "defer", "cause": "regular_dml_deferred_to_prepare"}]}, {"phase": "before_prepare", "steps": [{"stage": "can_proxy_sql_property", "outcome": "reject", "cause": "broadcast_all_nodes"}]}, {"phase": "post_prepare", "steps": []}], "final": {"action": "exec_in_this_node", "reason": "rejected_before_proxy"}}
通过 TRACE 中的 outcome=rejectcause=broadcast_all_nodes 可定位到:该 SQL 因被识别为需要广播到所有节点的查询,从而在 before_prepare 阶段被拒绝代理,最终在本节点执行。
示例 3:检查最近一段时间内 SQL 的代理动作分布,统计是否存在大量本地回退。
SELECT FINAL_ACTION, COUNT(*) AS cnt
FROM information_schema.PROXY_DECISION
GROUP BY FINAL_ACTION
ORDER BY cnt DESC;
输出示例:
+-------------------+-----+
| FINAL_ACTION | cnt |
+-------------------+-----+
| proxy_remote | 7 |
| exec_in_this_node | 2 |
| fallback_to_local | 1 |
+-------------------+-----+
fallback_to_local 占比偏高,可结合对应行的 TRACE 列分析回退原因,进而判断是否需要调整路由配置或排查节点连通性。
示例 4:通过 MISSING_BYTES_BEYOND_MAX_MEM_SIZE 识别被截断的 TRACE,并调大配额以保留完整内容。
SELECT SEQ, MISSING_BYTES_BEYOND_MAX_MEM_SIZE
FROM information_schema.PROXY_DECISION
WHERE MISSING_BYTES_BEYOND_MAX_MEM_SIZE > 0;

SET SESSION tdsql_proxy_decision_max_mem_size = 4194304;
tdsql_proxy_decision_max_mem_size 调大后,新写入的决策记录将按更大的上限保留 TRACE 内容;已写入的历史记录不会自动重新填充。