GaussDB JDBC导入和gsql导入在insert,replace,duplicate方式性能差异
- 问题现象
在insert插入数据,发现jdbc方式比gsql方式性能差。通过jdbc和gsql两种方式,对比以下三种插入数据方式,发现性能确实存在差异。
insert into XXX;
replace into XXX;
insert into XXX on duplicate XXX;
- 案例验证
1. gsql方式插入数据并查看耗时
− 表结构
gaussdb=> create table stu1 (f1 varchar(100),
gaussdb(> f2 varchar(100),
gaussdb(> f3 varchar(100));
CREATE TABLE
− 插入方式
insert into stu1 values (generate_series(1,200000),generate_series(1,200000), random() *100::decimal(5,2));
replace into stu2 values (generate_series(1,200000),generate_series(1,200000), random() *100::decimal(5,2));
insert into stu3 values (generate_series(1,200000), generate_series(1,200000), random() *100::decimal(5,2)) on duplicate key update f2 = generate_series(1,200000) + 1, f3=generate_series(1,200000)+1;
−执行耗时

− 执行计划
insert into XXX

replace into XXX

insert into XXX on duplicate XXX

jdbc方式插入数据并查看耗时
insert 方式

replace方式

insert ...duplicate 方式

执行耗时

− 执行计划
insert into XXX 执行计划


− replace into XXX

− insert into XXX on duplicate XXX

- 结果差异说明
gsql方式:三种方式语义一样,在数据库内部只解析一次,走硬解析,一条语句插入20万数据,所以耗时短。
jdbc方式:
a. insert into t_test (a,id,name) values(?,?,?) 走一次硬解析,20万次软解析,jdbc侧使用executeBatch接口调用,在数据库内部体现为执行了20万次insert,发送一次P报文,20万次UE报文,一个prepare语句多次调用,执行execute。
b. replace into t_test(id,name,a) values (?,?,?) 使用executeBatch接口批量插入20万数据,向内核发送pue报文,在数据库内部体现为执行了20万次insert,语句走一次硬解析,后边调用uE报文执行20万次,与1相同。replace into语句是先删除后更新,返回影响的结果有两行。

c. insert into t_test (id,name,a) values (?,?,?) on duplicate key update a = (a + ?),使用executeBatch接口批量插入20万数据,在数据库内部体现为执行了20万次insert。jdbc调用executeBatch接口向内核发送PUE报文,内部将此语句识别为upsert语句,此类语句不能走gplan计划复用,所以每次执行都会解析计划,耗时长.duplicate语句是原位更新,只影响一行。

- 点赞
- 收藏
- 关注作者
评论(0)