首批通过分布式安全可靠测评,为关键业务系统打造
执行计划
更新时间:2026-03-18 17:40:31
SQL 优化比较耗时,为了避免反复执行 SQL 优化,会将生成的计划放进 Plan Cache,再次执行时直接从 Plan Cache 获取 Plan。每个租户在每个节点上都有一个独立的 Plan Cache,用以缓存在此节点上处理过的 SQL Plan。
Plan Cache 相关视图包含 Plan Cache 的统计信息、执行统计的统计信息及计划信息,这些视图的数据均来自 Plan Cache。相关视图包括:
GV$OB_PLAN_CACHE_STAT:每个租户在每个节点上都有一个独立的 Plan Cache,用以缓存在此节点上处理过的 SQL Plan。该视图记录每个 Plan Cache 的统计信息,每个 Plan Cache 都有一条记录。GV$OB_PLAN_CACHE_PLAN_EXPLAIN:记录 Plan Cache 中计划的算子(Operator)信息,每个算子都有一条记录。GV$OB_PLAN_CACHE_PLAN_STAT:记录 Plan Cache 中计划的详细信息及其执行统计信息,每个计划都一条记录。
GV$OB_PLAN_CACHE_PLAN_EXPLAIN 视图记录了执行计划的详细信息,其主要字段介绍如下:
TENANT_ID:租户 ID。SVR_IP:节点 IP。PLAN_ID:执行计划 ID。PLAN_DEPTH:Operator 的深度。OPERATOR:Operator 的名称。NAME:Operator 对应的表名。ROWS:预估的结果行数。COST:预估的代价。PROPERTY:Operator 的详细信息。
注意
- 查询
GV$OB_PLAN_CACHE_PLAN_EXPLAIN视图时 , 需要指定TENANT_ID、SVR_IP、SVR_PORT、PLAN_ID的等值条件,否则查询结果为空。 - 查询
V$OB_PLAN_CACHE_PLAN_EXPLAIN视图时, 需要指定TENANT_ID、PLAN_ID的等值条件,否则查询结果为空。
例如,如下语句展示了一个执行计划:
obclient> select * from GV$OB_PLAN_CACHE_PLAN_EXPLAIN where tenant_id=1 and svr_ip='xx.xx.xx.xx' and svr_port=2882 and plan_id=349;
+-----------+-------------+----------+---------+------------+--------------+----------------------+--------------+------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| TENANT_ID | SVR_IP | SVR_PORT | PLAN_ID | PLAN_DEPTH | PLAN_LINE_ID | OPERATOR | NAME | ROWS | COST | PROPERTY |
+-----------+-------------+----------+---------+------------+--------------+----------------------+--------------+------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | xx.xx.xx.xx | 2882 | 349 | 0 | 0 | PHY_DIRECT_RECEIVE | NULL | 1 | 6 | NULL |
| 1 | xx.xx.xx.xx | 2882 | 349 | 1 | 1 | PHY_DIRECT_TRANSMIT | NULL | 1 | 5 | NULL |
| 1 | xx.xx.xx.xx | 2882 | 349 | 2 | 2 | PHY_TABLE_SCAN | __all_server | 1 | 2 | table_rows:6, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:default_stat, avaiable_index_name[__all_server] |
+-----------+-------------+----------+---------+------------+--------------+----------------------+--------------+------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.04 sec)
GV$OB_PLAN_CACHE_PLAN_STAT 视图记录 Plan Cache 中计划的详细信息及其执行统计信息,每个计划都一条记录。
TENANT_ID:租户 ID。SVR_IP:节点 IP。PLAN_ID:执行计划 ID,对应GV$OB_SQL_AUDIT视图中的PLAN_ID字段。SQL_ID:SQL ID,对应GV$OB_SQL_AUDIT视图中的SQL_ID字段。TYPE:执行计划的类型,1表示本地计划、2表示远程计划、3表示分布式计划。STATEMENT:参数化后的 SQL 语句。QUERY_SQL:第一次加载计划时的原始 SQL 语句。FIRST_LOAD_TIME:第一次被加载时间。SCHEMA_VERSION:Schema 版本号。LAST_ACTIVE_TIME:最近一次被执行时间。AVG_EXE_USEC:平均执行时间。SLOWEST_EXE_TIME:最慢执行的时间戳。SLOWEST_EXE_USEC:最慢执行的耗时。SLOW_COUNT:判断为慢查询次数,阈值通过集群配置项trace_log_slow_query_watermark控制。HIT_COUNT:命中次数。LARGE_QUERYS:判断为大查询次数,阈值通过集群配置项large_query_threshold控制。DELAYED_LARGE_QUERYS:被判断为大查询且被丢入大查询队列的次数。TIMEOUT_COUNT:超时次数。EXECUTIONS:执行次数。DISK_READS:所有执行物理读次数。DIRECT_WRITES:所有执行写盘的次数。BUFFER_GETS:所有执行逻辑读次数。APPLICATION_WAIT_TIME:执行所有 application 类事件的总时间。CONCURRENCY_WAIT_TIME:执行所有 concurrency 类事件的总时间。USER_IO_WAIT_TIME:所有执行所有 user_io 类事件的总时间。ROWS_PROCESSED:所有执行选择的结果行数或执行更改表中的行数。ELAPSED_TIME:所有执行接收到请求到执行结束消耗时间。CPU_TIME:所有执行消耗的 CPU 时间。OUTLINE_ID:是否命中用户创建的 Outline ID,为-1表示不是通过绑定 Outline 生成的计划。OUTLINE_DATA:计划对应的 Outline 信息。TABLE_SCAN:该查询是否为主键扫描。EVOLUTION:该执行计划是否在演进中。EVO_EXECUTIONS:演进次数。PS_STMT_ID:Prepare Statement 的 ID。