AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 123244
Accepted
davetapley
davetapley
Asked: 2015-12-09 14:37:45 +0800 CST2015-12-09 14:37:45 +0800 CST 2015-12-09 14:37:45 +0800 CST

通过批量迭代表来更新比在 PostgreSQL 中的整个表更快

  • 772

我有一张大约有一百万行的表。

它正在生产中使用,我运行了一个UPDATE覆盖约 95% 的行。

五个小时后,我取消了请求,因为它花了很长时间。


该表有一个自动递增的 ID 列,因此我尝试将WHERE查询条件扩展为包含id BETWEEN 1 AND 500.

此更新在大约两秒钟内完成。然后我手动迭代了id500 个批次,例如BETWEEN 500 AND 1000,然后BETWEEN 1000 AND 1500。

按照这个速度,将需要 2000 批 500 来更新整个表。

以 2 秒的速度更新 2000 个批次仅需要一个多小时。


我的问题是:

  1. 造成这种差异的原因是什么?
  2. 我不关心事务隔离,所以有没有一种方法可以模拟这种“批量更新”,而无需编写 2000 次更新的脚本以单独运行。
postgresql performance
  • 1 1 个回答
  • 14080 Views

1 个回答

  • Voted
  1. Best Answer
    Chris
    2015-12-09T15:28:13+08:002015-12-09T15:28:13+08:00

    我会尽力简短地回答你的问题,但由于我并不真正了解你对 PostgreSQL 的舒适程度,而且我也没有太多时间进行深入的解释,所以我'将使答案保持简单,如果您想了解更多信息,可以要求澄清。

    1)为什么批量更快?

    由于PostgreSQL 的预写日志的结构、 RAM 中共享缓冲区空间的数量以及尝试UPDATE在单个事务中执行整个操作,我的猜测是您根本没有足够的计算资源来有效地处理更新到单次交易中有近百万条记录。

    PostgreSQL 有一个完善的并发控制系统,本质上意味着它必须UPDATE在你的操作期间保持你的 pre-rows 的旧副本可用UPDATE。这样一来,如果另一个客户端在您更新时尝试访问这些行、更新失败或您取消更新,您不会丢失旧信息。

    如果执行足够大的UPDATE,PostgreSQL 会将页面加载到内存中并修改它们,但最终会耗尽内存来处理,因此如果它希望能够加载更多页面,它会被迫立即将这些页面临时复制到磁盘并继续交易。

    而不是能够在一段时间内分摊磁盘写入,您只是迫使您的数据库进入瓶颈。

    2) 编写更新脚本

    您绝对可以通过在PL/pgSQL中创建函数来编写更新脚本。有很多关于 PL/pgSQL 的知识,包括很多我可能不知道的,但一般来说,你可以做这样的事情

    CREATE OR REPLACE FUNCTION mini_batch_update()
      RETURNS void AS
    $BODY$
    DECLARE
    
    id_val integer;
    
    BEGIN
    
      FOR id_val IN 0..2000
      LOOP
    
      **UPDATE GOES HERE**
      WHERE id > (500 * id_val) AND id <= 500 * (id_val + 1);
    
      END LOOP;
    
    
    END
    $BODY$
    LANGUAGE plpgsql;
    

    我并没有花很多时间来使这个批处理功能处于最佳状态。我的意思是,为了简单起见,我只是硬编码了几个数值。在您的情况下,您可能希望获得更详细的信息并包括:1)检查最大 id 值以便您适当设置界限的东西,以及 2)即使我硬编码了 500 个批次,您也可以轻松地做到这一点函数输入参数。

    抱歉,我没有时间对此进行测试或确保它确实运行良好。祝你好运!

    • 10

相关问题

  • PostgreSQL 中 UniProt 的生物序列

  • 如何确定是否需要或需要索引

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve