本文主要介绍如何利用 SQL_ID 查询实时执行计划。
使用 EXPLAIN 命令可以展示当前优化器所生成的执行计划,但 SQL 在计划缓存中实际对应的计划可能与 EXPLAIN 的结果并不相同,造成这种现象的原因可能是统计信息变化、用户 session 变量设置变化等。为确定该 SQL 在系统中实际使用的执行计划,有时还需要进一步分析计划缓存中的物理执行计划。
OceanBase 数据库可以通过 gv$sql_audit 视图查到有问题的 SQL。有关 gv$sql_audit 的信息,请参见《OceanBase 数据库 参考指南》中的 性能视图 章节。
适用版本
OceanBase 数据库 V2.X 版本。
操作步骤
查询 SQL 在计划缓存中的
PLAN_ID。OceanBase 数据库在每台 Server 都有一份计划缓存。用户可以直接访问
gv$plan_cache_plan_stat视图,来查询本 Server 上的计划缓存,并提供租户 ID 和需要查询的 SQL 字符串(可以使用模糊匹配),查询该条 SQL 在计划缓存中对应的PLAN_ID。可以使用以下命令获取最耗时的 SQL 的
PLAN_ID。obclient> SELECT tenant_id,plan_id,svr_ip,svr_port,elapsed_time FROM oceanbase.gv$plan_cache_plan_stat ORDER BY elapsed_time DESC LIMIT 1; +-----------+---------+-----------------+----------+----------------------+ | tenant_id | plan_id | svr_ip | svr_port | elapsed_time | +-----------+---------+-----------------+----------+----------------------+ | 1 | 582518 | xxx.xxx.xxx.xxx | 2882 | 18445143226115784288 | +-----------+---------+-----------------+----------+----------------------+如果您已经从日志中获取了
SQL_ID,可以通过以下命令查询PLAN_ID。obclient> SELECT tenant_id,plan_id,svr_ip,svr_port,elapsed_time FROM oceanbase.gv$plan_cache_plan_stat WHERE SQL_ID='0DDD0CAD5372CCD285361AD0300FDB23';
使用得到的
PLAIN_ID展示对应的执行计划。根据上述得到的
TENANT_ID、PLAN_ID、SVR_IP和SVR_PORT,查询gv$plan_cache_plan_explain表。obclient> SELECT * FROM gv$plan_cache_plan_explain WHERE tenant_id=1 AND plan_id=582518 and ip='11.1166.78.136' and port=2882; +-----------+-----------------+------+---------+------------------+-----------------------+------+------+-------------------------------------------------------------------------------------------------------------------------------+ | TENANT_ID | IP | PORT | PLAN_ID | OPERATOR | NAME | ROWS | COST | PROPERTY | +-----------+-----------------+------+---------+------------------+-----------------------+------+------+-------------------------------------------------------------------------------------------------------------------------------+ | 1 | xxx.xxx.xxx.xxx | 2882 | 582518 | PHY_SORT | NULL | 100 | 2418 | NULL | | 1 | xxx.xxx.xxx.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 | +-----------+-----------------+------+---------+------------------+-----------------------+------+------+-------------------------------------------------------------------------------------------------------------------------------+注意
如果不提供
TENANT_ID、PLAN_ID、SVR_IP和SVR_PORT四个字段,查询gv$plan_cache_plan_explain不会返回任何结果。