可以通过 SELECT * FROM GV$SQL_AUDIT WHERE TRACE_ID ='xxxxx' AND IS_EXECUTOR_RPC=1 AND IS_INNER_SQL=0; 来找到此 SQL 所有的远程计划所执行的节点。
注意
OceanBase 数据库 V3.x、V4.x 版本中 SQL AUDIT 视图为 GV$OB_SQL_AUDIT 。
详细说明
一条 SQL 的所有执行上下文共用相同的 TRACE_ID,并且会完全记录到 SQL AUDIT 中,所以可以通过 TRACE_ID 过滤到此条 SQL 所有关联的信息。
SQL 在执行时会同时触发一些内部 SQL(INNER SQL),一般用于查询收集统计信息或更正元数据,这些 SQL 也都会记录到 SQL AUDIT 中并共用一个 TRACE_ID,所以我们需要过滤掉这些 INNER SQL,即 IS_INNER_SQL=0。
IS_EXECUTOR_RPC 代表此记录是否为RPC后的执行内容,IS_EXECUTOR_RPC=0 代表此 SQL 请求实际路由到的节点,即 SQL 的QC(查询协调者,Query Coordinator)IS_EXECUTOR_RPC=1 代表 RPC 执行记录,即 SQL 的 SQC(查询子协调者,Sub Query Coordinator)也就是远程计划中的远程执行节点的记录。
例如,如果表的 Leader 在 10 节点,但 SQL 请求发送到了 20 节点,OBServer 就需要将 SQL 通过 RPC 的方式转发到 10 节点上执行,此时 20 节点为 QC 节点,10 节点为 SQC 节点。所以最终记录到 SQL AUDIT 内的将会是两条记录:一条 QC 节点执行记录和一条 SQC 节点执行记录。
QC 节点执行记录完整记录了 SQL 的 SQL 文本(QUERY_SQL)、SQL_ID、PLAN_ID,但 SQC 节点执行记录这三者都为空,一般会被忽视过滤掉,但其记录的其他信息却在诊断问题时非常重要,例如执行耗时等,可以帮助我们直观感受到远程执行计划与本地执行计划的性能区别。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库所有版本。