适用版本
OceanBase 数据库 V4.0 之前的版本
操作步骤
使用 EXPLAIN 命令可以查看 SQL 的执行计划。但是在 SQL 实际执行时,因为传入参数以及执行环境的变化,SQL 语可能会选择会与 EXPLAIN 时不同的执行计划。SQL 执行时使用的物理执行计划可以通过以下系统视图获得。
- gv$sql_audit
- gv$plan_cache_plan_explain
可以通过 sys 租户查看 OceanBase 数据库所有租户中的查询计划以及清理执行计划缓存。
通过
gv$sql_audit查询某次 SQL 执行对应的svr_ip、svr_port、tenant_id、plan_id。SELECT svr_ip,svr_port,tenant_id,user_name, db_name, sql_id, plan_id, type, elapsed_time, execute_time, query_sql FROM gv$sql_audit WHERE tenant_id=1001 and user_name='xxxx' and query_sql like...根据上述得到的
svr_ip、svr_port、tenant_id、plan_id,查询gv$plan_cache_plan_explain视图,展示对应的执行计划。oceanbase 16:01:01> SELECT * FROM gv$plan_cache_plan_explain WHERE tenant_id=1 AND plan_id=582518 and ip='xx.xxx.xx.xxx' and port=2882; +-----------+---------------+------+---------+------------------+-----------------------+------+------+-------------------------------------------------------------------------------------------------------------------------------+ | TENANT_ID | IP | PORT | PLAN_ID | OPERATOR | NAME | ROWS | COST | PROPERTY | +-----------+---------------+------+---------+------------------+-----------------------+------+------+-------------------------------------------------------------------------------------------------------------------------------+ | 1 | xx.xxx.xx.xxx | 2882 | 582518 | PHY_SORT | NULL | 100 | 2418 | NULL | | 1 | xx.xxx.xx.xxx | 2882 | 582518 | PHY_TABLE_SCAN | __all_virtual_sysstat | 100 | 2000 | table_rows:100000, physical_range_rows:100, logical_range_rows:100, index_back_rows:0, output_rows:100, est_method:basic_stat | +-----------+---------------+------+---------+------------------+-----------------------+------+------+-------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.03 sec)
注意
gv$plan_cache_plan_explain 只支持主键查询,必须提供 svr_ip、svr_port、tenant_id、plan_id 四个字段进行匹配查询,否则结果显示为空。
更多信息
通过 root 用户登录到 sys 租户,执行 Plan cache 清空的命令如下。
alter system flush plan cache; #清空本机
alter system flush plan cache global; #清空整个集群
alter system flush plan cache tenant=ob_oracle global; #清空指定租户
alter system flush plan cache sql_id='xxxx' global; #清空指定sqlid
alter system flush plan cache databases='db1,db2' global; #清空指定DB