本文著重介紹PolarDB-X 1.0執(zhí)行計(jì)劃中各個(gè)操作符的含義,以便用戶(hù)通過(guò)查詢(xún)計(jì)劃了解SQL執(zhí)行流程,從而有針對(duì)性的進(jìn)行SQL調(diào)優(yōu)。

執(zhí)行計(jì)劃介紹

與多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)類(lèi)似,PolarDB-X 1.0在處理SQL時(shí),會(huì)通過(guò)優(yōu)化器生成執(zhí)行計(jì)劃,該執(zhí)行計(jì)劃由關(guān)系操作符構(gòu)成一個(gè)樹(shù)形結(jié)構(gòu),反映PolarDB-X 1.0如何執(zhí)行SQL語(yǔ)句。不同的是,PolarDB-X 1.0本身不存儲(chǔ)數(shù)據(jù),更側(cè)重考慮分布式環(huán)境中的網(wǎng)絡(luò)IO開(kāi)銷(xiāo),將運(yùn)算下推到各個(gè)分庫(kù)(如RDS/MySQL)執(zhí)行,從而提升SQL執(zhí)行效率。用戶(hù)可通過(guò)EXPLAIN命令查看SQL的執(zhí)行計(jì)劃。

文中示例均基于如下表結(jié)構(gòu):

CREATE TABLE `sbtest1` (
  `id`  INT(10) UNSIGNED NOT NULL,
  `k`   INT(10) UNSIGNED NOT NULL DEFAULT '0',
  `c`   CHAR(120)        NOT NULL DEFAULT '',
  `pad` CHAR(60)         NOT NULL DEFAULT '',
  KEY `xid` (`id`),
  KEY `k_1` (`k`)
) dbpartition BY HASH (`id`) tbpartition BY HASH (`id`) tbpartitions 4
            

如下示例展示了PolarDB-X 1.0執(zhí)行計(jì)劃的樹(shù)形結(jié)構(gòu)。

explain select a.k, count(*) cnt from sbtest1 a, sbtest1 b where a.id = b.k and a.id > 1000 group by k having cnt > 1300 order by cnt limit 5, 10;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                                                      |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| TmpSort(sort="cnt ASC", offset=?2, fetch=?3)                                                                                                      |
|   Filter(condition="cnt > ?1")                                                                                                                    |
|     Aggregate(group="k", cnt="COUNT()")                                                                                                           |
|       BKAJoin(id="id", k="k", c="c", pad="pad", id0="id0", k0="k0", c0="c0", pad0="pad0", condition="id = k", type="inner")                       |
|         Gather(sort="k ASC")                                                                                                                   |
|           LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?) ORDER BY `k`")        |
|         Gather(concurrent=true)                                                                                                                 |
|           LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE ((`k` > ?) AND (`k` IN ('?')))") |
| HitCache:false                                                                                                                                    |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set (0.01 sec)
            

PolarDB-X 1.0 EXPLAIN的結(jié)果總體分為兩部分:執(zhí)行計(jì)劃和其他信息。

  • 執(zhí)行計(jì)劃:以縮進(jìn)形式表示操作符之間的 "父-子" 關(guān)系。示例中,F(xiàn)ilter是TmpSort的子操作符,同時(shí)是Aggregate的父操作符。從真正執(zhí)行的角度看,每個(gè)操作符均從其子操作符中獲取數(shù)據(jù),經(jīng)當(dāng)前操作符處理,輸出給其父操作符。為方便理解,將以上執(zhí)行計(jì)劃轉(zhuǎn)換為更加直觀的樹(shù)形結(jié)構(gòu):
    456789
  • 其他信息:除執(zhí)行計(jì)劃外,EXPLAIN結(jié)果中還會(huì)有一些額外信息,目前僅有一項(xiàng)HitCache 。需要說(shuō)明的是,PolarDB-X 1.0會(huì)默認(rèn)開(kāi)啟PlanCache功能,HitCache表示當(dāng)前SQL是否命中PlanCache。 開(kāi)啟PlanCache后,PolarDB-X 1.0會(huì)對(duì)SQL做參數(shù)化處理,參數(shù)化會(huì)將SQL中的大部分常量用?替換,并構(gòu)建一個(gè)參數(shù)列表。在執(zhí)行計(jì)劃中的體現(xiàn)就是,LogicalView的SQL中會(huì)有? ,在部分操作符中會(huì)有類(lèi)似?2的字樣,這里的2表示其在參數(shù)列表中的下標(biāo),后續(xù)會(huì)結(jié)合具體的例子進(jìn)一步闡述。

EXPLAIN語(yǔ)法

EXPLAIN用于查看SQL語(yǔ)句的執(zhí)行計(jì)劃,語(yǔ)法如下:

EXPLAIN
{LOGICALVIEW | LOGIC | SIMPLE | DETAIL | EXECUTE | PHYSICAL | OPTIMIZER | SHARDING
 | COST | ANALYZE | BASELINE | JSON_PLAN | ADVISOR} 
 {SELECT statement | DELETE statement | INSERT statement | REPLACE statement| UPDATE statement}         

操作符介紹

LogicalView

LogicalView是從底層數(shù)據(jù)源獲取數(shù)據(jù)的操作符。從數(shù)據(jù)庫(kù)的角度來(lái)看,使用TableScan命名更符合常規(guī),但考慮到PolarDB-X 1.0本身不存儲(chǔ)數(shù)據(jù),而是通過(guò)SQL從底層數(shù)據(jù)源獲取,因此,該操作符中會(huì)記錄下推的SQL語(yǔ)句和數(shù)據(jù)源信息,這更像一個(gè) "視圖"。該 "視圖" 中的SQL,通過(guò)優(yōu)化器的下推,可能包含多種操作,如投影、過(guò)濾、聚合、排序、連接和子查詢(xún)等。

以下通過(guò)示例說(shuō)明EXPLAIN中LogicalView的輸出信息及其含義:

explain select * From sbtest1 where id > 1000;
+-----------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                          |
+-----------------------------------------------------------------------------------------------------------------------+
| UnionAll(concurrent=true)                                                                                             |
|   LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)") |
| HitCache:false                                                                                                        |
+-----------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
            

LogicalView的信息由三部分構(gòu)成:

  • tables:底層數(shù)據(jù)源對(duì)應(yīng)的表名,以.分割,其前是分庫(kù)對(duì)應(yīng)的編號(hào),其后是表名及其編號(hào),對(duì)于連續(xù)的編號(hào),會(huì)做簡(jiǎn)寫(xiě),如[000-127],表示表名編號(hào)從000127的所有表。
  • shardCount:需要訪問(wèn)的分表總數(shù),該示例中會(huì)訪問(wèn)從000127共128張分表。
  • sql:下發(fā)至底層數(shù)據(jù)源的SQL模板。這里顯示的并非真正下發(fā)的SQL語(yǔ)句,PolarDB-X 1.0在執(zhí)行時(shí)會(huì)將表名替換為物理表名;另外,SQL中的常量10?替換,這是因?yàn)?span id="z68uejxpaoma" class="ph" data-tag="ph" id="ph-dky-0tt-38x">PolarDB-X 1.0默認(rèn)開(kāi)啟了PlanCache功能,對(duì)SQL做了參數(shù)化處理。
UnionAll

UnionAll是UNION ALL對(duì)應(yīng)的操作符,該操作符通常有多個(gè)輸入,表示將多個(gè)輸入的數(shù)據(jù)UNION在一起。以上示例中,LogicalView之上的UnionAll表示將所有分表中的數(shù)據(jù)進(jìn)行UNION。

UnionAll中的concurrent表示是否并行執(zhí)行其子操作符,默認(rèn)為true。

UnionDistinct

與UnionAll類(lèi)似,UnionDistinct是UNION DISTINCT對(duì)應(yīng)的操作符。示例如下:

explain select * From sbtest1 where id > 1000 union distinct select * From sbtest1 where id < 200;
+-------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                            |
+-------------------------------------------------------------------------------------------------------------------------+
| UnionDistinct(concurrent=true)                                                                                          |
|   UnionAll(concurrent=true)                                                                                             |
|     LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)") |
|   UnionAll(concurrent=true)                                                                                             |
|     LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` < ?)") |
| HitCache:false                                                                                                          |
+-------------------------------------------------------------------------------------------------------------------------+
6 rows in set (0.02 sec)
            
MergeSort

MergeSort,歸并排序操作符,通常有多個(gè)子操作符。PolarDB-X 1.0中實(shí)現(xiàn)了兩種排序:基于有序數(shù)據(jù)的歸并排序和對(duì)無(wú)序數(shù)據(jù)的內(nèi)存排序。示例如下:

explain select *from sbtest1 where id > 1000 order by id limit 5,10;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                                                      |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| MergeSort(sort="id ASC", offset=?1, fetch=?2)                                                                                                     |
|   LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?) ORDER BY `id` LIMIT (? + ?)") |
| HitCache:false                                                                                                                                    |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
            

MergeSort操作符包含三部分內(nèi)容:

  • sort:表示排序字段以及排列順序,id ASC表示按照id字段遞增排序,DESC表示遞減排序。
  • offset:表示獲取結(jié)果集時(shí)的偏移量,同樣由于對(duì)SQL做了參數(shù)化,示例中的offset表示為?1 ,其中?表示這是一個(gè)動(dòng)態(tài)參數(shù),其后的數(shù)字對(duì)應(yīng)參數(shù)列表的下標(biāo)。示例中SQL對(duì)應(yīng)的參數(shù)為[1000, 5, 10],因此,?1實(shí)際對(duì)應(yīng)的值為5。
  • fetch:表示最多返回的數(shù)據(jù)行數(shù)。與offset類(lèi)似,同樣是參數(shù)化的表示,實(shí)際對(duì)應(yīng)的值為10。
Aggregate

Aggregate是聚合操作符,通常包含兩部分內(nèi)容:Group By字段和聚合函數(shù)。示例如下:

explain select k, count(*) from sbtest1 where id > 1000 group by k;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                                                                                |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Aggregate(group="k", count(*)="SUM(count(*))")                                                                                                                              |
|   MergeSort(sort="k ASC")                                                                                                                                                   |
|     LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT `k`, COUNT(*) AS `count(*)` FROM `sbtest1` WHERE (`id` > ?) GROUP BY `k` ORDER BY `k`") |
| HitCache:true                                                                                                                                                               |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)
            

Aggregate 包含兩部分內(nèi)容:

  • group:表示GROUP BY字段,示例中為k 。
  • 聚合函數(shù):=前為聚合函數(shù)對(duì)應(yīng)的輸出列名,其后為對(duì)應(yīng)的計(jì)算方法。示例中的count(*)="SUM(count(*))" ,第一個(gè)count(*)對(duì)應(yīng)輸出的列名,隨后的SUM(count(*))表示對(duì)其輸入數(shù)據(jù)中的count(*)列進(jìn)行SUM運(yùn)算得到最終的count(*)。

由此可見(jiàn),PolarDB-X 1.0將聚合操作分為兩部分,首先將聚合操作下推至底層數(shù)據(jù)源做局部聚合,最終在PolarDB-X 1.0層面對(duì)局部聚合的結(jié)果做全局聚合。另外,PolarDB-X 1.0的最終聚合是基于排序做的,因此,會(huì)在優(yōu)化器階段為其添加一個(gè)Sort子操作符,而Sort操作符又進(jìn)一步通過(guò)下推Sort轉(zhuǎn)換為MergeSort。

如下為AVG聚合函數(shù)的例子:

explain select k, avg(id) avg_id from sbtest1 where id > 1000 group by k;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Project(k="k", avg_id="sum_pushed_sum / sum_pushed_count")|
|   Aggregate(group="k", sum_pushed_sum="SUM(pushed_sum)", sum_pushed_count="SUM(pushed_count)")|
|     MergeSort(sort="k ASC")|
|       LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT `k`, SUM(`id`) AS `pushed_sum`, COUNT(`id`) AS `pushed_count` FROM `sbtest1` WHERE (`id` > ?) GROUP BY `k` ORDER BY `k`")|
| HitCache:false|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.01 sec)
            

PolarDB-X 1.0會(huì)將AVG聚合函數(shù)轉(zhuǎn)換為SUM / COUNT,再分別根據(jù)SUMCOUNT的下推規(guī)則,將其轉(zhuǎn)換為局部聚合和全局聚合。您可自行嘗試了解其他聚合函數(shù)的執(zhí)行計(jì)劃。

說(shuō)明 PolarDB-X 1.0會(huì)將 DISTINCT操作轉(zhuǎn)換為 GROUP操作,示例如下:
explain select distinct k from sbtest1 where id > 1000;
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                                                        |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| Aggregate(group="k")                                                                                                                                |
|   MergeSort(sort="k ASC")                                                                                                                           |
|     LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT `k` FROM `sbtest1` WHERE (`id` > ?) GROUP BY `k` ORDER BY `k`") |
| HitCache:false                                                                                                                                      |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.02 sec)
            
TmpSort

TmpSort,表示在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行排序。與MergeSort的區(qū)別在于,MergeSort可以有多個(gè)子操作符,且每個(gè)子操作符返回的數(shù)據(jù)都已經(jīng)排序。TmpSort僅有一個(gè)子操作符。

TmpSort對(duì)應(yīng)的查詢(xún)計(jì)劃信息與MergeSort一致,請(qǐng)參考MergeSort。

Project

Project表示投影操作,即從輸入數(shù)據(jù)中選擇部分列輸出,或者對(duì)某些列進(jìn)行轉(zhuǎn)換(通過(guò)函數(shù)或者表達(dá)式計(jì)算)后輸出,當(dāng)然,也可以包含常量。以上AVG的示例中,最頂層就是一個(gè)Project,其輸出ksum_pushed_sum / sum_pushed_count ,后者對(duì)應(yīng)的列名為avg_id 。

explain select '你好, DRDS', 1 / 2, CURTIME();
+-------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                        |
+-------------------------------------------------------------------------------------+
| Project(你好, DRDS="_UTF-16'你好, DRDS'", 1 / 2="1 / 2", CURTIME()="CURTIME()") |
|                                                                                     |
| HitCache:false                                                                      |
+-------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
            

可見(jiàn),Project的計(jì)劃中包括每列的列名及其對(duì)應(yīng)的列、值、函數(shù)或者表達(dá)式。

Filter

Filter表示過(guò)濾操作,其中包含一些過(guò)濾條件。該操作符對(duì)輸入數(shù)據(jù)進(jìn)行過(guò)濾,若滿(mǎn)足條件,則輸出,否則丟棄。如下是一個(gè)較復(fù)雜的例子,包含了以上介紹的大部分操作符。

explain select k, avg(id) avg_id from sbtest1 where id > 1000 group by k having avg_id > 1300;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN  |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Filter(condition="avg_id > ?1")  |
|   Project(k="k", avg_id="sum_pushed_sum / sum_pushed_count")  |
|     Aggregate(group="k", sum_pushed_sum="SUM(pushed_sum)", sum_pushed_count="SUM(pushed_count)")  |
|       MergeSort(sort="k ASC")  |
|         LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT `k`, SUM(`id`) AS `pushed_sum`, COUNT(`id`) AS `pushed_count` FROM `sbtest1` WHERE (`id` > ?) GROUP BY `k` ORDER BY `k`") |
| HitCache:false  |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
6 rows in set (0.01 sec)
            

在以上AVG示例的SQL基礎(chǔ)上添加了having avg_id > 1300,執(zhí)行計(jì)劃最上層添加了一個(gè)Filter操作符,用于過(guò)濾所有滿(mǎn)足avg_id > 1300的數(shù)據(jù)。

有讀者可能會(huì)問(wèn),WHERE中的條件為什么沒(méi)有對(duì)應(yīng)的Filter操作符呢?在PolarDB-X 1.0優(yōu)化器的某個(gè)階段,WHERE條件的Filter操作符的確是存在的,只是最終將其下推到了LogiacalView中,因此可以在LogicalView的sql中看到id > 1000

NlJoin

NlJoin,表示NestLoop Join操作符,即使用NestLoop方法進(jìn)行兩表Join。PolarDB-X 1.0中實(shí)現(xiàn)了兩種JOIN策略:NlJoin和BKAJoin,后者表示Batched Key Access Join,批量鍵值查詢(xún),會(huì)從左表取一批數(shù)據(jù),構(gòu)建一個(gè)IN條件拼接在訪問(wèn)右表的SQL中,從右表一次獲取一批數(shù)據(jù)。

explain select a.* from sbtest1 a, sbtest1 b where a.id = b.k and a.id > 1000;
+----------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                               |
+----------------------------------------------------------------------------------------------------------------------------+
| Project(id="id", k="k", c="c", pad="pad")                                                                                  |
|   NlJoin(id="id", k="k", c="c", pad="pad", k0="k0", condition="id = k", type="inner")                                      |
|     UnionAll(concurrent=true)                                                                                              |
|       LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)")  |
|     UnionAll(concurrent=true)                                                                                              |
|       LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT `k` FROM `sbtest1` WHERE (`k` > ?)") |
| HitCache:false                                                                                                             |
+----------------------------------------------------------------------------------------------------------------------------+
7 rows in set (0.03 sec)
            

NlJOIN的計(jì)劃包括三部分內(nèi)容:

  • 輸出列信息:輸出的列名,示例中的JOIN會(huì)輸出5列 id="id", k="k", c="c", pad="pad", k0="k0"
  • condition:連接條件,示例中連接條件為id = k 。
  • type:連接類(lèi)型,示例中是INNER JOIN,因此其連接類(lèi)型為inner 。
BKAJoin

BKAJoin(Batched Key Access Join),表示通過(guò)批量鍵值查詢(xún)的方式進(jìn)行JOIN,即從左表取一批數(shù)據(jù),構(gòu)建一個(gè)IN條件拼接在訪問(wèn)右表的SQL中,從右表一次獲取一批數(shù)據(jù)進(jìn)行JOIN。

explain select a.* from sbtest1 a, sbtest1 b where a.id = b.k order by a.id;
+-------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                                  |
+-------------------------------------------------------------------------------------------------------------------------------+
| Project(id="id", k="k", c="c", pad="pad")                                                                                     |
|   BKAJoin(id="id", k="k", c="c", pad="pad", id0="id0", k0="k0", c0="c0", pad0="pad0", condition="id = k", type="inner")       |
|     MergeSort(sort="id ASC")                                                                                                  |
|       LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` ORDER BY `id`")        |
|     UnionAll(concurrent=true)                                                                                                 |
|       LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`k` IN ('?'))") |
| HitCache:false                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------+
7 rows in set (0.01 sec)
            

BKAJoin的計(jì)劃內(nèi)容與NlJoin相同,這兩個(gè)操作符命名不同,旨在告知執(zhí)行器以何種方法執(zhí)行JOIN操作。另外,以上執(zhí)行計(jì)劃中右表的LogicalView中'k' IN ('?')是優(yōu)化器構(gòu)建出來(lái)的對(duì)右表的IN查詢(xún)模板。

LogicalModifyView

如上文介紹,LogicalView表示從底層數(shù)據(jù)源獲取數(shù)據(jù)的操作符,與之對(duì)應(yīng)的,LogicalModifyView表示對(duì)底層數(shù)據(jù)源的修改操作符,其中也會(huì)記錄一個(gè)SQL語(yǔ)句,該SQL可能是INSERT、UPDATE或者DELETE。

explain update sbtest1 set c='Hello, DRDS' where id > 1000;
+--------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                                   |
+--------------------------------------------------------------------------------------------------------------------------------+
| LogicalModifyView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="UPDATE `sbtest1` SET `c` = ? WHERE (`id` > ?)") |
| HitCache:false                                                                                                                 |
+--------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.03 sec)

explain delete from sbtest1 where id > 1000;
+-------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                            |
+-------------------------------------------------------------------------------------------------------------------------+
| LogicalModifyView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="DELETE FROM `sbtest1` WHERE (`id` > ?)") |
| HitCache:false                                                                                                          |
+-------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.03 sec)
            

LogicalModifyView查詢(xún)計(jì)劃的內(nèi)容與LogicalView類(lèi)似,包括下發(fā)的物理分表,分表數(shù)以及SQL模板。同樣,由于開(kāi)啟了PlanCache,對(duì)SQL做了參數(shù)化處理,SQL模板中的常量會(huì)用?替換。

PhyTableOperation

PhyTableOperation表示對(duì)某個(gè)物理分表執(zhí)行一個(gè)操作。該操作符目前僅用于INSERT INTO ... VALUES ...。

explain insert into sbtest1 values(1, 1, '1', '1'),(2, 2, '2', '2');
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                                                                                                                 |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PhyTableOperation(tables="SYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_001]", sql="INSERT INTO ? (`id`, `k`, `c`, `pad`) VALUES(?, ?, ?, ?)", params="`sbtest1_001`,1,1,1,1") |
| PhyTableOperation(tables="SYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_002]", sql="INSERT INTO ? (`id`, `k`, `c`, `pad`) VALUES(?, ?, ?, ?)", params="`sbtest1_002`,2,2,2,2") |
|                                                                                                                                                                                                              |
| HitCache:false                                                                                                                                                                                               |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)
            

示例中,INSERT插入兩行數(shù)據(jù),每行數(shù)據(jù)對(duì)應(yīng)一個(gè)PhyTableOperation操作符,PhyTableOperation操作符的內(nèi)容包括三部分:

  • tables:物理表名,僅有唯一一個(gè)物理表名。
  • sql:SQL模板,該SQL模板中表名和常量均被參數(shù)化,用?替換,對(duì)應(yīng)的參數(shù)在隨后的params中給出。
  • params:SQL模板對(duì)應(yīng)的參數(shù),包括表名和常量。

其他信息

HitCache

PolarDB-X 1.0會(huì)默認(rèn)開(kāi)PlanCache 功能,HitCache用于告知用戶(hù)當(dāng)前查詢(xún)是否命中PlanCache。如下示例,第一次運(yùn)行HitCache為false,第二次運(yùn)行為true。

explain select * From sbtest1 where id > 1000;
+-----------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                          |
+-----------------------------------------------------------------------------------------------------------------------+
| UnionAll(concurrent=true)                                                                                             |
|   LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)") |
| HitCache:false                                                                                                        |
+-----------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)

explain select * From sbtest1 where id > 1000;
+-----------------------------------------------------------------------------------------------------------------------+
| LOGICAL PLAN                                                                                                          |
+-----------------------------------------------------------------------------------------------------------------------+
| UnionAll(concurrent=true)                                                                                             |
|   LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM `sbtest1` WHERE (`id` > ?)") |
| HitCache:true                                                                                                         |
+-----------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)