当前位置: 首页 > article >正文

亿级数据表多线程update锁表问题

目录

1、问题描述

2、原因分析

3、问题解决


1、问题描述

在pg数据库,某个业务,有一张数据表test,数据表结果如下: test(sjjbh,wlbid,gzmb,sfzg,zgsj,cjsj,xx...),这个表没有主键,会有很多重复数据。 test表需要根据另外表(是多张表),动态更新sfzg字段,  加入另外表结构如下 sjj_ckb1(wlbid,sjjbh,xxxxx...)。

方案是:多线程执行下面的步骤

1、根据sjjbh,找到数据集对应的数据物理表,然后查询select wlbid from sjj_ckb1 where 具体的条件

2、更新test表   update test set sfzg = 'Y' where sjjbh='数据集编号' and wlbid not in(第一步的id)

   and gzbm = '编码‘

在生成环境,test达到2000w以上数据,存在以下问题:

(1) 问题1 update 操作经常会报canceling statement due to lock timeout

(2) 问题2:  每个update执行速度很慢,可能一个update 就几个小时

2、原因分析

(1)canceling statement due to lock timeout 是因为多个sql,命中了相同的数据,导致锁冲突,update失败

(2)update慢,是因为update没用用到索引,not in都是全表扫描,对于全表更新是灾难性的

(3)单表数据量达到千万级别,而且是持续增长,test表没有主键,就算用到索引也可以预见的不会很快

3、问题解决

1、test表,弄成分区表,并且弄一个自增主键id    id定义成bigserial

把普通表变成分区表步骤如下:

(1)新建数据表test1,test1定义成分区表,test1字段和test一样,但是多了一个主键id

CREATE TABLE test1 (
id bigserial ,
"sjjzwm" varchar(128) COLLATE "pg_catalog"."default",
"sjjbh" varchar(128) COLLATE "pg_catalog"."default",
"gzbm" varchar(32) COLLATE "pg_catalog"."default",
"input_time" timestamp(6),
"update_date" timestamp(6),
"wlbid" varchar(200) COLLATE "pg_catalog"."default"
)
with(appendoptimized=true, compresstype=zlib,compresslevel=5,orientation=column)
DISTRIBUTED BY(sjjbh)
PARTITION BY range(input_time)
(
partition pn start('2023-01-01'::date) end ('2030-12-31'::date) every ('1 year' :: interval),
default partition other
);

(2)把test数据同步到test1表

insert into test1(字段信息)select * from test

这样数据表就有了自增主键

(3)test表重命名成test_back

  (4) test1表重命名成test

2、update的时候,不用not in,在代码里面查到需要更新的id。

(1)第一步查test表数据,  select id,wlbid  from test where sjjbh='' and  gzbm=''

   (2)查参照表,符合条件的wlbid,  select wlbid from sjj_ckb1 where 具体的条件

  (3) 找到需要更新的id.

   wlbid在(2)中存在,在(1)中不存在的id

(4)更具id更新具体的数据。

这样因为用到了id这个唯一标识,不存在多线程,同时更新同一条数据的情况


http://www.kler.cn/news/312257.html

相关文章:

  • 浅谈人工智能之基于ollama本地大模型结合本地知识库搭建智能客服
  • 2024最新版,人大赵鑫老师《大语言模型》新书pdf分享
  • 嵌套函数的例子(TypeScript)
  • QT QObject源码学习(二)
  • Netty源码解析-请求处理与多路复用
  • uniapp中使用picker-view选择时间
  • vulhub搭建漏洞环境docker-compose up -d命令执行报错以及解决方法汇总
  • 信息收集常用指令
  • PDF样本册如何分享到朋友圈
  • Qt自定义信号、带参数的信号、lambda表达式和信号的使用
  • elemntui el-switch 在表格内改变状态失败,怎么复原???
  • 一文读懂SpringCLoud
  • 【RabbitMQ 项目】服务端数据管理模块之交换机管理
  • prometheus监控linux虚拟机
  • 操作系统迁移(CentOs -> Ubuntu)
  • Wacom 和 Splashtop 携手共赴 IBC 2024 展会,宣布向欧洲市场隆重推出 Wacom Bridge
  • XSS漏洞挖掘利用总结(附个人常用payload)
  • MyBatis 分批次执行(新增,修改,删除)
  • ROS激光雷达介绍
  • WPF中图片的宫格显示
  • TPDO触发条件如何满足?
  • AI学习指南深度学习篇-Adam的Python实践
  • 如何配置和使用自己的私有 Docker Registry
  • python的6种常用数据结构
  • 3.大语言模型LLM的公开资源(API、语料库、算法库)
  • Python中的树与图:构建复杂数据结构的艺术
  • 图论三元环(并查集的高级应用)
  • 天润融通创新功能,将无效会话转化为企业新商机
  • 青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
  • Python 集合的魔法:解锁高效数据处理的秘密