本文著重介紹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):
- 其他信息:除執(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}
操作符介紹
LogicalViewLogicalView是從底層數(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)從000
到127
的所有表。 - shardCount:需要訪問(wèn)的分表總數(shù),該示例中會(huì)訪問(wèn)從
000
到127
共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是UNION ALL
對(duì)應(yīng)的操作符,該操作符通常有多個(gè)輸入,表示將多個(gè)輸入的數(shù)據(jù)UNION在一起。以上示例中,LogicalView之上的UnionAll表示將所有分表中的數(shù)據(jù)進(jìn)行UNION。
UnionAll中的concurrent
表示是否并行執(zhí)行其子操作符,默認(rèn)為true。
與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是聚合操作符,通常包含兩部分內(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ù)SUM
和COUNT
的下推規(guī)則,將其轉(zhuǎn)換為局部聚合和全局聚合。您可自行嘗試了解其他聚合函數(shù)的執(zhí)行計(jì)劃。
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,表示在內(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。
ProjectProject表示投影操作,即從輸入數(shù)據(jù)中選擇部分列輸出,或者對(duì)某些列進(jìn)行轉(zhuǎn)換(通過(guò)函數(shù)或者表達(dá)式計(jì)算)后輸出,當(dāng)然,也可以包含常量。以上AVG
的示例中,最頂層就是一個(gè)Project
,其輸出k
和sum_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á)式。
FilterFilter表示過(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,表示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(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)模板。
如上文介紹,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表示對(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ù),包括表名和常量。
其他信息
HitCachePolarDB-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)