【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】v4.3.5.0
【问题描述】insert into … select … 语句使用上旁路导入比不使用性能下降了 50%,求问原因
【复现路径】问题出现前后相关操作
- 部署集群,选用 OLAP 场景创建租户
obd cluster tenant create obtest -n test --max-cpu=28 --memory-size=98G --zone-list=zone1,zone2,zone3 --primary-zone=RANDOM \
--locality=F@zone1,F@zone2,F@zone3 --charset=utf8 -s 'ob_tcp_invited_nodes="%"' --optimize=olap
- 调整配置参数
set global parallel_servers_target = 560;
ALTER SYSTEM SET default_table_store_format = 'row';
SET GLOBAL parallel_degree_policy = MANUAL;
- 用 sysbench 准备3个表数据,每个表1000万行
create table tmp1 like sbtest1;
-
ALTER TABLE tmp1 MODIFY id int(11) NOT NULL;
– 删除目标表主键自增属性 - 分别使用旁路导入和传统路径导入插入数据,发现使用旁路导入执行时间变慢了2.4倍。
mysql> insert /*+ enable_parallel_dml parallel(16) no_direct */ into tmp1 select * from sbtest1;
Query OK, 10000000 rows affected (10.24 sec)
Records: 10000000 Duplicates: 0 Warnings: 0
mysql> truncate table tmp1;
Query OK, 0 rows affected (0.16 sec)
mysql> insert /*+ enable_parallel_dml parallel(16) DIRECT(true, 0, 'full') */ into tmp1 select * from sbtest1;
Query OK, 10000000 rows affected (24.42 sec)
Records: 10000000 Duplicates: 0 Warnings: 0
- 用上
NO_GATHER_OPTIMIZER_STATISTICS
hint 没有区别
mysql> insert /*+ enable_parallel_dml parallel(16) DIRECT(true, 0, 'full') NO_GATHER_OPTIMIZER_STATISTICS */ into tmp1 select * from sbtest1;
Query OK, 10000000 rows affected (24.58 sec)
Records: 10000000 Duplicates: 0 Warnings: 0
mysql> insert /*+ enable_parallel_dml parallel(16) no_direct NO_GATHER_OPTIMIZER_STATISTICS */ into tmp1 select * from sbtest1;
Query OK, 10000000 rows affected (10.45 sec)
Records: 10000000 Duplicate:: 0 Warnings: 0
执行计划:
-
/*+ enable_parallel_dml parallel(16) no_direct NO_GATHER_OPTIMIZER_STATISTICS */
pdml_no_direct_path_plan.log (19.0 KB) -
/*+ enable_parallel_dml parallel(16) DIRECT(true, 0, 'full') NO_GATHER_OPTIMIZER_STATISTICS */
pdml_direct_path_plan.log (17.3 KB)