首页 > 其他分享 >亿级数据表多线程update锁表问题

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

时间:2024-09-20 17:51:34浏览次数:3  
标签:test1 wlbid 锁表 update 数据表 test 多线程 sjjbh id

目录

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这个唯一标识,不存在多线程,同时更新同一条数据的情况

标签:test1,wlbid,锁表,update,数据表,test,多线程,sjjbh,id
From: https://blog.csdn.net/s07aser123/article/details/142387268

相关文章

  • 多线程搜索文件拷贝-Python脚本
    单线程的文件拷贝太折磨人了,所以这里使用多线程的方式去拉满软件效率importosimportshutilimportthreadingimportqueueclassFileItem:"""自定义文件对象类,用于存储文件路径和命名序号"""def__init__(self,path,index):self.path=path......
  • 【专题】2024年9月游戏行业报告合集汇总PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=37732在当今数字化高速发展的时代,游戏行业已然成为了文化与科技融合的前沿阵地。中国游戏行业凭借着不断创新的技术、丰富多元的内容以及日益拓展的市场,正以蓬勃之姿在全球舞台上绽放光彩。阅读原文,获取专题报告合集全文,解锁文末153份游戏相关行业......
  • JavaSE——多线程基础
    概述        现代操作系统(Windows,macOS,Linux)都可以执行多任务。多任务就是同时允许多个任务。例如:播放音乐的同时,浏览器可以进行文件下载,同时可以进行QQ消息的收发。    CPU执行代码都是一条一条顺序执行的,但是,即使是单核CPU,也可以同时运行多个任务。因为操......
  • 易优eyoucms网站数据表或视图不存在[错误代码] SQLSTATE[42S02],数据库表不存在。
    数据表或视图不存在[错误代码]SQLSTATE[42S02]:Basetableorviewnotfound:1146Table'fszojdk.web2023_archives'doesn'texist根据提供的错误信息 SQLSTATE[42S02]:Basetableorviewnotfound:1146Table'fszojdk.web2023_archives'doesn'texist,......
  • 优化下载性能:使用Python多线程与异步并发提升下载效率
    文章目录......
  • Java多线程-(线程的创建,线程安全,线程状态)
    第一章.创建线程的方式1.第一种方式_extendsThread1.定义一个自定义线程类继承Thread2.重写run方法(run方法是用于设置线程任务的)3.创建自定义线程类对象4.调用Thread类中的start方法(start方法:开启线程,jvm自动执行run方法)publicclassMyThreadextendsThread{......
  • 多线程下载nginx站点目录下文件
    代码如下importosimporttimeimportrequestsfrombs4importBeautifulSoupfromurllib.parseimporturljoinfromconcurrent.futuresimportThreadPoolExecutor,as_completedfromtqdmimporttqdmbase_url=""#要下载文件的基础URLdownload_dir="&......
  • Java EE(多线程)
    1.认识线程(Thread)  1️⃣每个线程都是一个独立的执行流,都可以单独参与cpu的调度.  2️⃣每个进程里至少包含一个线程时(及为主线程)或多个线程,同一个进程创建多个线程时,线程会共享同一份资源(内存➕   文件描述符.)     ⚠️:多个进程之间并不会共享同一份资源......
  • 第八章,多线程
    高级编程文章目录高级编程第八章,多线程一,多线程二,主线程三,线程的创建和启动四,线程的状态五,同步方法六,线程安全的类型七,常见类型对比第八章,多线程一,多线程什么是多线程如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”多个线程交替占......
  • PGSQL-查看sql正在运行的进程、查看表是否被锁、解锁表
    1.PGSQL-查看sql正在运行的进程SELECTdatname,pid,state,queryFROMpg_stat_activitywherestate='active'SELECTprocpid,START,now()-STARTASlap,current_queryFROM(SELECTbackendid,pg_stat_get_b......