当前位置: 首页 > 知识库问答 >
问题:

多个单个更新与一个大型更新的速度

殷耀
2023-03-14

我有一个表,其中有一个主id列(自动索引)、两个子id列(也已索引)和12列类型geometry(Polygon)。如果我要更新此表上的约200万行,运行约200万条单独的更新语句是否更快

update TABLE_NAME set ( COLUMNS ) = ( VALUES ) where ID_COLUMN = NEXT_ID

还是像下面的答案那样,执行较少数量的较大更新语句更快

update TABLE_NAME as update_t set
COLUMNS = new_vals.COLUMNS
from (values
(id, polygon1val, polygon2val, ... polygon12val),   /* row 1 */
(id, polygon1val, polygon2val, ... polygon12val),   /* row 2 */
...                                                 /* ...   */
(id, polygon1val, polygon2val, ... polygon12val)    /* row N */
) as new_vals( COLUMNS )
where new_vals.id = update_t.id

如果是后者,你对什么是好的N有什么建议吗?是N = ~2mil,还是一些较小的子集(我会重复直到它们全部完成)?

编辑:显然,在前一种情况下,我会使用准备好的语句。但我也想知道,在后一种情况下,尝试使用准备好的声明是否有任何好处?

我使用的是PostgreSQL 9.2。

共有1个答案

公冶才
2023-03-14

通常,将操作批量化为集的效果越好,数据库就越有快速的选项。如果单独运行更新,则唯一的选项是“找到受影响的一行,将其删除,插入新行”

如果您可以批量更新,那么计划员就可以决定顺序扫描是否比一组索引扫描更快(很可能是这样,因为您可以利用预读缓存)。换句话说,一个命令更新许多行几乎总是比许多命令更新一行执行得更好,即使不考虑计划开销。

 类似资料:
  • 我正在使用齐柏林飞艇0.6.2和火花2.0。 我尝试在循环中执行查询,但效果不是很好。 我需要循环一个数据帧的每一行,大约5000行,并执行一个查询,这将在另一个数据帧中增加一个值。 以下是我的尝试: 我试着从两个数据帧中提取一小部分,但仍然很慢。我觉得我做得不对。 知道如何快速更新数据帧吗?

  • 您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解正确的语法....

  • 问题内容: 我知道您可以一次插入多行,是否可以在MySQL中一次更新多行(如在一个查询中)? 编辑:例如,我有以下内容 我想将以下所有更新合并到一个查询中 问题答案: 是的,这是可能的-您可以在插入的键更新中使用INSERT…。 使用您的示例:

  • 问题内容: 我想知道存储过程中是否可以有多个Update语句 像这样的东西: 现在,我将单独执行它们,但是由于它们只能一起使用,所以我想知道它们是否可以仅位于一个SP中。 问题答案: 是的,有可能:

  • 问题内容: 我有2张桌子,如下所示: serial_table serial_key CHARACTER VARYING(20), PRIMARY KEY(id, serial_key) serial_rate: serial_key CHARACTER VARYING(20), rate NUMERIC, PRIMARY KEY(id, serial_key), FOREIGN KEY (id,

  • 问题内容: 我看到这对笨论坛 考虑以下代码 这显然是您在Codeigniter中这样做的方式 实际上这是行不通的。我看了一下生成的SQL,结果甚至没有提到联接。 有谁知道如何使用Codeigniter的Active Record数据库类对联接进行更新? 问题答案: 我发现的一种解决方案是完全删除联接并将联接条件移到“ where”函数中,此外,您还需要更改更新字符串以包括新表。