使用Explain命令,可以展示出当前优化器所生成的执行计划,但该SQL在计划缓存中实际对应的计划可能与Explain的结果并不相同,造成这种现象的原因有很多,诸如统计信息变化、用户session变量设置变化等等。为了确定该SQL在系统中实际使用的执行计划,有时还需要进一步分析计划缓存中的物理执行计划。

    用户可以通过查询(g)v$plan_cache_plan_explain这张虚拟表来展示某条SQL在计划缓存中的执行计划。

    第一步 查询SQL在计划缓存中的plan id

    OceanBase的计划缓存是每个server一个。查询本server上的计划缓存,用户可以直接访问v$plan_cache_plan_stat视图,并提供租户id和需要查询的SQL字符串(可以使用模糊匹配),查询该条SQL在计划缓存中对应的plan id。

    1. OceanBase(root@oceanbase)>select *
    2. from v$plan_cache_plan_stat
    3. where tenant_id= 1001
    4. and statement like 'insert into t1 values%'\G
    5. ***************************1. row ***************************
    6. tenant_id: 1001
    7. svr_ip:100.81.152.44
    8. svr_port:15212
    9. plan_id: 7
    10. sql_id:0
    11. type: 1
    12. statement: insert into t1 values(1)
    13. plan_hash:1
    14. last_active_time:2016-05-28 19:08:57.416670
    15. avg_exe_usec:0
    16. slowest_exe_time:1970-01-01 08:00:00.000000
    17. slowest_exe_usec:0
    18. slow_count:0
    19. hit_count:0
    20. mem_used:8192
    21. 1 rowin set (0.01 sec)

    第二步 使用得到的plan id展示对应执行计划

    在得到plan id后,用户可以使用tenant id和plan id访问v$plan_cache_plan_explain来展示在该执行计划。

    注意:这里展示的计划为物理执行计划,在算子命名上会与Explain所展示的逻辑执行计划有所不同。

    1. OceanBase (root@oceanbase)> select *
    2. from v$plan_cache_plan_explain
    3. where tenant_id = 1001 and plan_id = 7;
    4. +-----------+---------------+-------+---------+--------------------+------+------+------+
    5. | TENANT_ID | IP | PORT | PLAN_ID | OPERATOR | NAME | ROWS | COST |
    6. +-----------+---------------+-------+---------+--------------------+------+------+------+
    7. | 1001 | 100.81.152.44 | 15212 | 7 | PHY_ROOT_TRANSMIT | NULL | 0 | 0 |
    8. | 1001 | 100.81.152.44 | 15212 | 7 | PHY_INSERT | NULL | 0 | 0 |
    9. | 1001 | 100.81.152.44 | 15212 | 7 | PHY_EXPR_VALUES | NULL | 0 | 0 |
    10. +-----------+---------------+-------+---------+--------------------+------+------+------+
    11. 3 rows in set (0.01 sec)

    注意:如果访问gv$plan_cache_plan_explain,必须给定ip、port、tenant_id、plan_id这四列的值;如果访问v$plan_cache_plan_explain,必须给定tenant_id和plan_id的值,否则,系统将返回空集。

    v$plan_cache_plan_explain

    对于plan cache中plan的基本信息解释

    视图定义:

    1. view_definition='SELECT *
    2. FROM oceanbase.gv$plan_cache_plan_explain
    3. WHERE IP =HOST_IP() AND PORT = RPC_PORT()'

    字段定义:

    字段名称

    类型

    描述

    TENANT_ID

    bigint(20)

    租户id

    IP

    varchar(32)

    ip地址

    PORT

    bigint(20)

    端口号

    PLAN_ID

    bigint(20)

    plan的id

    OPERATOR

    varchar(128)

    operator的名称

    NAME

    varchar(128)

    表的名称

    ROWS

    bigint(20)

    预估的结果行数

    COST

    bigint(20)

    预估的代价

    PROPERTY

    varchar(256)

    对应operator的信息