PolarDB支持ETL(Extract Transform Load)功能,開啟該功能后,您可以在RW節點上使用列存索引,RW節點的SQL語句中的SELECT請求會發送至只讀列存節點并使用列存索引功能進行加速查詢,讀取數據后,PolarDB會通過內部網絡將數據傳回RW節點并寫入目標表。
技術原理
前提條件
集群版本需滿足以下條件之一:
PolarDB MySQL版8.0.1版本且Revision version為8.0.1.1.29及以上。
PolarDB MySQL版8.0.2版本且Revision version為8.0.2.2.12及以上。
您可以通過查詢版本號來確認集群版本。
使用限制
該功能僅適用于以下兩種SQL語句:
CREATE TABLE table_name [AS] SELECT ...
INSERT ... SELECT ...
使用方法
您可以在數據庫中通過設置下表中的參數值來選擇是否從只讀列存節點讀取數據,以及在讀取數據時是否需要壓縮文件。
參數 | 說明 |
etl_from_imci | 是否從只讀列存節點讀取數據。取值如下:
|
etl_from_imci_compress | 從只讀列存節點讀取數據時,是否需要壓縮文件。取值如下:
|
在修改參數值時,您可以將參數值設置為Global級別、Session級別或語句級別,以etl_from_imci參數為例:
設置為Global級別。
SET GLOBAL etl_from_imci = ON;
設置為Global級別后,當前集群的所有
CREATE TABLE new_tbl [AS] SELECT ..
和INSERT ... SELECT ...
請求都會從只讀列存節點讀取數據。設置為Session級別。
SET etl_from_imci = ON;
設置為Session級別后,僅當前Session下的
CREATE TABLE new_tbl [AS] SELECT ..
和INSERT ... SELECT ...
請求會從只讀列存節點讀取數據。設置為語句級別。
您可以通過HINT語法為某條SQL語句選擇是否從只讀列存節點讀取數據。示例如下:
CREATE TABLE t2 SELECT /*+ SET_VAR(etl_from_imci=ON) */ * from t1 where 'A' = 'a';
當etl_from_imci參數設置為ON,即選擇從只讀列存節點讀取數據,數據讀取完成并傳回RW節點時,您可以通過SHOW processlist
命令查看processlist狀態,此時,processlist狀態應為ETL FROM IMCI。
使用說明
當查詢條件復雜,SQL語句執行時間較長但查詢的結果集數據量較小時,開啟ETL功能可以明顯提升性能。
開啟ETL功能并不是在所有場景下都能帶來性能收益,某些場景下性能可能會下降。例如:
當查詢比較簡單時,從遠程的只讀列存節點讀取數據會引入額外的網絡傳輸和結果集解析開銷,性能可能會下降。
當查詢的結果集數據量比較大時,從只讀列存節點讀取數據并傳入RW節點,以及在RW節點上將數據寫入表成為主要瓶頸,使用該功能會導致性能下降。
性能比對
使用TPCH-10 GB數據集測試較復雜的查詢。示例如下:
查詢結果為1行數據。
select sum(l_extendedprice * l_discount) as revenue from lineitem where l_shipdate >= date '1994-01-01' and l_shipdate < date '1994-01-01' + interval '1' year and l_discount between .06 - 0.01 and .06 + 0.01 and l_quantity < 24
查詢結果為1行數據時,查詢時間對比如下(單位:秒):
只讀列存節點查詢時間
未開啟ETL功能,在RW節點執行
CREATE TABLE new_tbl [AS] SELECT ..
語句的時間開啟ETL功能后,在RW節點執行
CREATE TABLE new_tbl [AS] SELECT ..
語句的時間未開啟ETL功能,在RW節點執行
INSERT ... SELECT ...
語句的時間開啟ETL功能后,在RW節點執行
INSERT ... SELECT ...
語句的時間0.05
>60
0.17
>60
0.08
查詢結果為4行數據。
select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_extendedprice) as sum_base_price, sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, avg(l_quantity) as avg_qty, avg(l_extendedprice) as avg_price, avg(l_discount) as avg_disc, count(*) as count_order from lineitem where l_shipdate <= date '1998-12-01' - interval '90' day group by l_returnflag, l_linestatus order by l_returnflag, l_linestatus
查詢結果為4行數據時,查詢時間對比如下(單位:秒):
只讀列存節點查詢時間
未開啟ETL功能,在RW節點執行
CREATE TABLE new_tbl [AS] SELECT ..
語句的時間開啟ETL功能后,在RW節點執行
CREATE TABLE new_tbl [AS] SELECT ..
語句的時間未開啟ETL功能,在RW節點執行
INSERT ... SELECT ...
語句的時間開啟ETL功能后,在RW節點執行
INSERT ... SELECT ...
語句的時間0.58
>60
0.64
>60
0.58
查詢結果為27840行數據。
select p_brand, p_type, p_size, count(distinct ps_suppkey) as supplier_cnt from partsupp, part where p_partkey = ps_partkey and p_brand <> 'Brand#45' and p_type not like 'MEDIUM POLISHED%' and p_size in (49, 14, 23, 45, 19, 3, 36, 9) and ps_suppkey not in ( select s_suppkey from supplier where s_comment like '%Customer%Complaints%' ) group by p_brand, p_type, p_size order by supplier_cnt desc, p_brand, p_type, p_size
查詢結果為27840行數據時,查詢時間對比如下(單位:秒):
只讀列存節點查詢時間
未開啟ETL功能,在RW節點執行
CREATE TABLE new_tbl [AS] SELECT ..
語句的時間開啟ETL功能后,在RW節點執行
CREATE TABLE new_tbl [AS] SELECT ..
語句的時間未開啟ETL功能,在RW節點執行
INSERT ... SELECT ...
語句的時間開啟ETL功能后,在RW節點執行
INSERT ... SELECT ...
語句的時間0.55
>60
0.92
>60
0.82