首页 > 数据库 >金仓数据库KingbaseES 两表关联Update的两种写法与性能

金仓数据库KingbaseES 两表关联Update的两种写法与性能

时间:2023-05-05 22:24:06浏览次数:29  
标签:金仓 rows 两表 .. t2 Update 1000000 t1 cost

原文链接:https://blog.csdn.net/arthemis_14/article/details/127886142

熟悉oracle 的人都知道,对于两表的关联更新,其执行计划主要有 Filter 和 Outer Join 两种方式。对于大批量数据的update,Join方式明显是更优的选择。KingbaseES 也支持两种方式的关联update,语法上采用两种不同的写法。

以下以例子的形式展示两种写法及性能上的差异。这些例子同时通过KingbaseES V8R6环境验证。

一、准备测试数据
create table t1(id1 integer,name1 varchar(200));

create table t2(id2 integer,name2 varchar(200));



insert into t1 select * from (select generate_series(1,1000000),repeat('a',50)) as a order by random();

insert into t2 select * from (select generate_series(1,1000000),repeat('b',50)) as a order by random();



create index ind_t1_id1 on t1(id1);

create index ind_t2_id2 on t2(id2);



analyze t1;

analyze t2;
二、性能测试
1、语法一
采用类似oracle filter 方式,逐条处理t1 表的每条记录。对于t1表的每条记录,都需要访问t2表。

test=# explain analyze update t1 set name1=(select name2 from t2 where id1=id2);

QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------

Update on t1 (cost=0.00..8462810.00 rows=1000000 width=428) (actual time=13072.720..13072.721 rows=0 loops=1)

-> Seq Scan on t1 (cost=0.00..8462810.00 rows=1000000 width=428) (actual time=0.035..6620.732 rows=1000000 loops=1)

SubPlan 1

-> Index Scan using ind_t2_id2 on t2 (cost=0.42..8.44 rows=1 width=51) (actual time=0.006..0.006 rows=1 loops=1000000)

Index Cond: (id2 = t1.id1)

Planning Time: 0.116 ms

Execution Time: 13072.780 ms

(7 rows)
2、语法二
采用hash join,大批量的update 效率更高。

test=# explain analyze update t1 set name1=name2 from t2 where id1=id2; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------- Update on t1 (cost=37693.00..98122.00 rows=1000000 width=67) (actual time=8197.309..8197.312 rows=0 loops=1) -> Hash Join (cost=37693.00..98122.00 rows=1000000 width=67) (actual time=349.817..1633.896 rows=1000000 loops=1) Hash Cond: (t2.id2 = t1.id1) -> Seq Scan on t2 (cost=0.00..20310.00 rows=1000000 width=61) (actual time=0.021..191.730 rows=1000000 loops=1) -> Hash (cost=20310.00..20310.00 rows=1000000 width=10) (actual time=348.798..348.798 rows=1000000 loops=1) Buckets: 131072 Batches: 16 Memory Usage: 3594kB -> Seq Scan on t1 (cost=0.00..20310.00 rows=1000000 width=10) (actual time=0.034..153.882 rows=1000000 loops=1) Planning Time: 0.780 ms Execution Time: 8197.543 ms
三、结论
对于大批量数据update,基于hash join 的update方法效率上要高效很多。

标签:金仓,rows,两表,..,t2,Update,1000000,t1,cost
From: https://www.cnblogs.com/fswhq/p/17362695.html

相关文章

  • 金仓数据库字符串分割函数
    1.SPLIT_PARTSPLIT_PART()函数通过指定分隔符分割字符串,并返回第N个子串。语法:SPLIT_PART(string,delimiter,position)11、string:待分割的字符串2、delimiter:指定分割字符串3、position:返回第几个字串,从1开始,该参数必须是正数。如果参数值大于分割后字符串的数量,函数返回......
  • docker mysql 容器自动停止 -- docker update
    原因:mysql容器占用资源过高被系统杀死解决方法dockerupdate-m500M--memory-reservation500M--memory-swap1000M容器id/容器名说明-m限制内存最大值--memory-reservation是弹性控制内存大小,防止损失性能,建议要开。当宿主机资源充足时,允许容器尽量多地使......
  • 删除Maven仓库的.lastUpdate文件
    windows10环境构建Maven项目时经常会遇到jar包下载失败的原因,主要原因为仓库链接和网络问题。但是如果存在lastUpdate文件,就算网络好时jar也会下载失败,这时需要删除这些文件。删除这些文件的步骤:1.打开cmd命令2.进入到maven仓库所在位置3.执行命令:for/r%iin(*.lastUpdated)d......
  • 删除Maven仓库的.lastUpdate文件
    windows10环境构建Maven项目时经常会遇到jar包下载失败的原因,主要原因为仓库链接和网络问题。但是如果存在lastUpdate文件,就算网络好时jar也会下载失败,这时需要删除这些文件。删除这些文件的步骤:1.打开cmd命令2.进入到maven仓库所在位置3.执行命令:for/r%iin(*.lastUpdat......
  • 为什么 SELECT FOR UPDATE 只在事务中起作用
    在MySQL中SELECTFORUPDATE建议要在事务中运行,原因是当SELECTFORUPDATE执行完之后,就释放锁了。其实查询出来的数据接下来还要更新,所以建议必须要在事务中运行,针对spring事务其实就是加注解@Transaction。图二中显示一直转圈圈,说明上一个图中已经上了锁,第二图的更新必须要在......
  • 对外提供的api保证接口的幂等 (先select 再 update innodb是行级锁, mysam是表级的
    额外的状态字段,这个状态值一般只会单流程变更,不管通过什么消息传递,目前申万宏源的每一个业务大部分都走流程,走的过程就有唯一的业务字段配合工作流workflow服务来进行业务流转个人观点解决幂等只有两种方式第一种依赖上游带过来的唯一标志,然后我们给这个唯一标志加锁保证请......
  • bat禁用win update
    @echooffnetstopwuauservscconfigwuauservstart=disabledscprivwuauservrecovery=Disableschtasks/Change/TN"\Microsoft\Windows\WindowsUpdate\sih"/DISABLEschtasks/Change/TN"\Microsoft\Windows\WindowsUpdate\ScheduledS......
  • [FireDAC][Phys]-330. Cannot generate update query. Update table undefined.
    在正式的查询SQL前,用了临时表存储查询条件,数据正常加载,结果编辑、保存时报错了代码是老早前写,现在看,其实完全可以直接用存储过程的结果,也不用中间再转一次,这个异常也就可以避过去了 ......
  • 错误until the update interval of nexus-releases has elapsed or updates are force
    错误:untiltheupdateintervalofnexus-releaseshaselapsedorupdatesareforced  (从文件系统里传的,而不是从nexues界面上传的),有些文件nexues从中央仓库里下载不到,本人从别处拷贝一个上传去后,执行mvncompile时出现该错误。  解决办法:mvncleaninstall-U -Umeansfor......
  • update(修改数据)
    语法格式:update表set value1=值1,value2=值2 where 条件注意:1、字段之间使用逗号隔开  2、修改的值,看类型加引号举例一:修改一个字段把老王的age改成100修改前......