OceanBase 實(shí)時(shí)執(zhí)行計(jì)劃展示

2021-06-30 09:34 更新

使用 EXPLAIN 命令可以展示出當(dāng)前優(yōu)化器所生成的執(zhí)行計(jì)劃,但由于統(tǒng)計(jì)信息變化、用戶 session 變量設(shè)置變化等,會(huì)造成該 SQL 在計(jì)劃緩存中實(shí)際對(duì)應(yīng)的計(jì)劃可能與 EXPLAIN 的結(jié)果并不相同。為了確定該 SQL 在系統(tǒng)中實(shí)際使用的執(zhí)行計(jì)劃,需要進(jìn)一步分析計(jì)劃緩存中的物理執(zhí)行計(jì)劃。

用戶可以通過(guò)查詢 (g)v$plan_cache_plan_explain 視圖來(lái)展示某條 SQL 在計(jì)劃緩存中的執(zhí)行計(jì)劃。

如下例所示:

obclient>VIEW_DEFINITION='SELECT * 
                 FROM oceanbase.gv$plan_cache_plan_explain
                 WHERE IP =host_ip() AND PORT = rpc_port()'

參數(shù)解釋如下表:

字段名稱

類型

描述

TENANT_ID

bigint(20)

租戶 ID

IP

varchar(32)

IP 地址

PORT

bigint(20)

端口號(hào)

PLAN_ID

bigint(20)

執(zhí)行計(jì)劃的 ID

OPERATOR

varchar(128)

operator 的名稱

NAME

varchar(128)

表的名稱

ROWS

bigint(20)

預(yù)估的結(jié)果行數(shù)

COST

bigint(20)

預(yù)估的代價(jià)

PROPERTY

varchar(256)

對(duì)應(yīng) operator 的信息

第一步 查詢 SQL 在計(jì)劃緩存中的 plan_id

OceanBase 數(shù)據(jù)庫(kù)每個(gè)服務(wù)器的計(jì)劃緩存都是獨(dú)立的。用戶可以直接訪問(wèn) v$plan_cache_plan_stat 視圖查詢本服務(wù)器上的計(jì)劃緩存并提供 tenant_id 和需要查詢的 SQL 字符串(可以使用模糊匹配),查詢?cè)摋l SQL 在計(jì)劃緩存中對(duì)應(yīng)的 plan_id。

obclient>SELECT * FROM v$plan_cache_plan_stat  WHERE tenant_id= 1001 
                                AND STATEMENT LIKE 'INSERT INTO T1 VALUES%'\G

***************************1. row ***************************
       tenant_id: 1001
          svr_ip:100.81.152.44
        svr_port:15212
         plan_id: 7
          sql_id:0
            type: 1
       statement: insert into t1 values(1)
       plan_hash:1
last_active_time:2016-05-28 19:08:57.416670
    avg_exe_usec:0
slowest_exe_time:1970-01-01 08:00:00.000000
slowest_exe_usec:0
      slow_count:0
       hit_count:0
        mem_used:8192
1 rowin set (0.01 sec)

第二步 使用 plan_id 展示對(duì)應(yīng)執(zhí)行計(jì)劃

獲得 plan_id 后,用戶可以使用 tenant_id 和 plan_id 訪問(wèn) v$plan_cache_plan_explain 來(lái)展示該執(zhí)行計(jì)劃。

注意 
這里展示的計(jì)劃為物理執(zhí)行計(jì)劃,在算子命名上會(huì)與 EXPLAIN 所展示的邏輯執(zhí)行計(jì)劃有所不同。
obclient>SELECT * FROM v$plan_cache_plan_explain
           WHERE tenant_id = 1001 AND plan_id = 7;
                            
+-----------+---------------+-------+---------+--------------------+------+------+------+
| TENANT_ID | IP            | PORT  | PLAN_ID | OPERATOR           | NAME | ROWS | COST |
+-----------+---------------+-------+---------+--------------------+------+------+------+
|      1001 | 100.81.152.44 | 15212 |       7 |  PHY_ROOT_TRANSMIT | NULL |    0 |    0 |
|      1001 | 100.81.152.44 | 15212 |       7 |   PHY_INSERT       | NULL |    0 |    0 |
|      1001 | 100.81.152.44 | 15212 |       7 |    PHY_EXPR_VALUES | NULL |    0 |    0 |
+-----------+---------------+-------+---------+--------------------+------+------+------+
3 rows in set (0.01 sec)
注意 
如果訪問(wèn) gv$plan_cache_plan_explain,必須給定 IP、port、tenant_id 和 plan_id 這四列的值。
如果訪問(wèn) v$plan_cache_plan_explain,必須給定 tenant_id 和 plan_id 的值,否則系統(tǒng)將返回空集。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)