INSERT…SELECT… 语句中的 SELECT 语句查询,并将结果通过内部网络将数据传回读写实例并写入目标表。详细的功能描述请参考 加速 ETL 回写。INSERT...SELECT... 加速,暂不支持 UPDATE...SELECT... 以及 DELETE...SELECT... 等场景加速。INSERT…SELECT… 语句中的 SELECT 查询比较简单时,从只读分析引擎读取数据并回写到读写实例会带来额外的网络开销。对比直接从读写实例读取数据的优势并不明显。INSERT…SELECT… 语句中的 SELECT 查询结果集数据量大的情况下,此时主要的性能瓶颈在于结果集通过网络传输并写入读写实例的过程。此场景无法使用此功能来优化性能。INSERT…SELECT… 的 SQL 执行场景。参数名 | 参数说明 | 默认值 | 参数值 |
libra_etl_to_rw | 控制是否执行回写功能。 | off | on:开启回写能力,表示执行回写。 off:关闭回写能力。当值为 off 时,执行 INSERT…SELECT… 语句时会报错权限不足。 |
libra_concurrent_etl | 控制是否在回写读写实例时开启并发写入。 | off | on: 开启并发回写。并发回写能提升结果回写效率,但是不能保证多线程间写入的事务一致性。 off:关闭并发回写。设置为此值时,回写至读写实例的数据将在一个事务中完成。 |
libra_etl_concurrency | 控制回写读写实例的并发线程数。只有在 libra_concurrent_etl 设置为 on 时才会生效。 | 1 | 取值范围:[1 - 读写实例 CPU 核数],可设置值为整数,最大值为读写实例的 CPU 核数。 注意: 使用多并发回写时执行速度更快,但是并发数量过高会导致读写实例无法承受其写入压力而使得实例性能受损。 |
set libra_etl_to_rw=on;set libra_concurrent_etl=on;set libra_etl_concurrency=4;INSERT INTO database1.table1 select a.t1,b.t2,a.t2,b.t3 from a,b where a.t1=b.t1 and a.t5='x';set libra_concurrent_etl=off;set libra_etl_to_rw=off;
INSERT /*+ SET_VAR(libra_etl_to_rw=ON) SET_VAR(libra_concurrent_etl=ON) SET_VAR(libra_etl_concurrency=4)*/ INTO database1.table1 select a.t1,b.t2,a.t2,b.t3 from a,b where a.t1=b.t1 and a.t5='x';
set libra_etl_to_rw=on;set libra_concurrent_etl=off;set libra_etl_concurrency=1;create table t1 (supp_nation VARCHAR(50),cust_nation VARCHAR(50),l_year INT,revenue DECIMAL);INSERT INTO t1 SELECTsupp_nation, cust_nation, l_year, sum(volume) as revenuefrom (select n1.n_name as supp_nation, n2.n_name as cust_nation,extract(year from l_shipdate) as l_year,l_extendedprice * (1 - l_discount) as volumefrom supplier, lineitem, orders, customer, nation n1, nation n2where s_suppkey = l_suppkeyand o_orderkey = l_orderkeyand c_custkey = o_custkeyand s_nationkey = n1.n_nationkeyand c_nationkey = n2.n_nationkeyand ((n1.n_name = 'JAPAN' and n2.n_name = 'INDIA')or (n1.n_name = 'INDIA' and n2.n_name = 'JAPAN'))and l_shipdate between '1995-01-01' and '1996-12-31') as shippinggroup by supp_nation, cust_nation, l_yearorder by supp_nation, cust_nation, l_year;
只读实例 SELECT 的时间 | 未开启回写功能 在读写实例执行 INSERT…SELECT… 的时间 | 开启回写功能 在只读分析引擎执行 INSERT…SELECT… 的时间 |
0.57 | 232.77 | 0.61 |
set libra_etl_to_rw=on;set libra_concurrent_etl=off;set libra_etl_concurrency=1;CREATE TABLE t2(p_brand VARCHAR(10),p_type VARCHAR(25),p_size INTEGER,supplier_cnt INTEGER);INSERT INTO t2 SELECTp_brand,p_type,p_size,count(distinct ps_suppkey) as supplier_cntfrompartsupp,partwherep_partkey = ps_partkeyand 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 (selects_suppkeyfromsupplierwheres_comment like '%Customer%Complaints%')group byp_brand,p_type,p_sizeorder bysupplier_cnt desc,p_brand,p_type,p_size;
只读实例 SELECT 的时间 | 未开启回写功能 在读写实例执行 INSERT…SELECT… 的时间 | 开启回写功能 在只读分析引擎执行 INSERT…SELECT… 的时间 |
0.15 | 8.77 | 0.61 |
set libra_etl_to_rw=on;set libra_concurrent_etl=on;set libra_etl_concurrency=8;CREATE TABLE IF NOT EXISTS lineitem ( L_ORDERKEY INTEGER NOT NULL,L_PARTKEY INTEGER NOT NULL,L_SUPPKEY INTEGER NOT NULL,L_LINENUMBER INTEGER NOT NULL,L_QUANTITY DECIMAL(15,2) NOT NULL,L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,L_DISCOUNT DECIMAL(15,2) NOT NULL,L_TAX DECIMAL(15,2) NOT NULL,L_RETURNFLAG CHAR(1) NOT NULL,L_LINESTATUS CHAR(1) NOT NULL,L_SHIPDATE DATE NOT NULL,L_COMMITDATE DATE NOT NULL,L_RECEIPTDATE DATE NOT NULL,L_SHIPINSTRUCT CHAR(25) NOT NULL,L_SHIPMODE CHAR(10) NOT NULL,L_COMMENT VARCHAR(44) NOT NULL , primary key(L_ORDERKEY, L_LINENUMBER));INSERT INTO lineitem_t SELECT*fromlineitem;
执行并发 | 未开启回写功能 在读写实例执行 INSERT…SELECT… 的时间 | 开启回写功能 在只读分析引擎执行 INSERT…SELECT… 的时间 |
不开启并发 | 622.7 | 1441.02 |
并发数为8 | | 259.20 |
并发数为16 | | 181.79 |
并发数为32 | | 185.64 |
文档反馈