亿级数据表多线程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.xdnf.cn/news/1540206.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue报错 ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

报错 vue-project0.0.0 dev vite‘vite’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。解决 第1步. 控制台输入 npm install -g create-vite第2步. 控制台输入 npm install -g vite第3步. 运行就ok啦

【HTTP】方法(method)以及 GET 和 POST 的区别

文章目录 方法(method)登录上传GET 和 POST 有什么区别(面试)区别不准确的说法 方法(method) 首行中的第一部分。首行是由方法、URL 和版本号组成 方法描述了这次请求想干什么,最主要的是&…

13 vue3之内置组件keep-alive

内置组件keep-alive 有时候我们不希望组件被重新渲染影响使用体验;或者处于性能考虑,避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。 开启keep-alive 生命周期的变化 初次进入时:…

基于SpringBoot+Vue的私人牙科诊所管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

MySQL函数介绍--日期与时间函数(一)

我相信大家在学习各种语言的时候或多或少听过我们函数或者方法这一类的名词,函数在计算机语言的使用中可以说是贯穿始终,那么大家有没有思考过到底函数是什么?函数的作用又是什么呢?我们为什么要使用函数?其实&#xf…

模型案例:| 篮球识别模型

导读 2023年以ChatGPT为代表的大语言模型横空出世,它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力,为人工智能技术的发展开辟了新的可能性。同时,人工智能技术正在进入各种应用领…

CANopen开源库canfestival的移植

本文记录将CANopen开源库CANfestival移植到GD32F470单片机的过程。CANopen协议理解请参考博客:CANopen协议的理解-CSDN博客 CANfestival开源库下载链接 CSDN链接: https://download.csdn.net/download/heqiunong/89774627 官网链接:https:/…

HTML常见语法设计

HTML常见语法设计 1.HTML类和ID类id 2.HTML 响应式 Web 设计3.HTML5 语义元素4.HTML 字符实体5.HTML 编码(字符集) 1.HTML类和ID 类 对 HTML 进行分类(设置类),使我们能够为元素的类定义 CSS 样式。为相同的类设置相…

耐高温滑环的应用场景及市场前景分析

耐高温滑环是一种重要的电气连接装置,广泛应用于需要传递电力和信号的旋转设备中。随着工业技术的发展,对耐高温滑环的需求不断增加,尤其是在极端温度环境下的应用场合,耐高温滑环展现出其独特的优势。 耐高温滑环在工业自动化领…

第157天: 安全开发-Python 自动化挖掘项目SRC 目标FOFA 资产Web 爬虫解析库

案例一:Python-WEB 爬虫库&数据解析库 这里开发的内容不做过多描述,贴上自己写的代码 爬取数据 要爬取p标签,利用Beautyfulsoup模块 import requests,time from bs4 import BeautifulSoup#url"https://src.sjtu.edu.cn/rank/firm…

双十一好物狂欢派对,五款剁手超值好物分享

在这个全民狂欢的购物节,我们迎来了一年一度的双十一盛典。双十一不仅是一场双十一好物狂欢派对,更是我们表达对生活品质追求的最佳时机。无论是智能家电、时尚潮品、还是日常必备,每一件好物都蕴含着对美好生活的无限向往。今年的双十一&…

内控合规管理

内控合规管理 1.内控合规概述2.信息科技风险管理概述组织架构与指责管理内容 3.监督检查4.制度管理5.业务连续性管理6.信息科技外包管理7.分支机构管理 1.内控合规概述 在具体实践中,IT内控合规管理的领域包括:信息科技风险管理、监督检查、制度和公文管…

Postman如何测试WebSocket接口!

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直…

rpm方式安装Mysql报错依赖冲突解决

使用rpm安装mysql时在安装到client包时报错依赖库冲突以及GPG密钥问题, 解决 1,下载 MySQL 的 YUM 存储库文件。 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 2,安装下载的 YUM 存储库文件。 sudo rpm -…

Excel lookup函数使用方法及案例说明

大家好,这里是效率办公指南! 🔍 在Excel中,LOOKUP函数是一个强大的工具,用于查找和返回数据。无论是从一列中查找对应的值,还是在数据表中进行复杂的查找,LOOKUP函数都能帮助我们快速找到所需的…

VScode 修改 cursor 键盘设置

vscode 中按下 ctrl K 后 ctrl s 打开键盘快捷键设置。 搜索光标 cursor 找到 cursorDown 以及对应需要修改的快捷键命令 右键 添加快捷键设置 修改即可 alt space 关闭win设置中的中英文切换 代码提示下移 selectPrevSuggestion 上移

电脑usb控制软件有哪些?6款软件帮你轻松解决USB端口泄密烦恼!

在数字化时代,企业的信息安全成为重中之重。 然而,USB端口泄密事件频发,给企业的数据安全和业务连续性带来了巨大威胁。 此前,某大型制造企业,由于员工在日常工作中频繁使用U盘等USB存储设备,导致公司核心…

推荐五种msvcr71.dll丢失的解决方法,msvcr71.dll为什么会丢失?

当你的电脑提示msvcr71.dll丢失时是什么情况?为什么会出现这样的问题?msvcr71.dll丢失和什么有关呢?那么msvcr71.dll丢失应该如何解决呢?今天就和大家聊聊msvcr71.dll丢失的解决办法的详细解决步骤。 msvcr71.dll丢失是否与系统更…

在 Windows 上安装 Python

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

Nexus3的妙用

nexus 3使用场景 Nexus是一个全能仓库,通过部署nexus可以实现包含yum、apt、Maven、pypi、docker等的多种仓库。以下是nexus的适用场景: 当公共仓库无法访问或缓慢时,搭建nexus。比如国内docker无法访问,需要镜像加速。可以使用海外主机部署nexus,在nexus中创建docker(p…