问题标签 [bulkupdate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1303 浏览

mysql - 对大型 InnoDB 表中的未索引列进行批量更新

我在 Mysql 5.1 数据库中有一个 InnoDB 表,它有大约 2700 万行。该表有三个未索引mediumint unsigned的列,我希望能够定期全局重置为“0”。例如:

这个非常简单的更新查询遇到了 InnoDB 的行级锁定问题。锁定太多行后,更新查询失败,并出现有据可查的错误:

问题在于,对于如此大的表,单个行锁的数量已经超过了为存储锁分配的空间。

我找到了一些关于如何处理这个问题的建议:

锁定整个表以关闭行锁定
这似乎是最好、最干净的解决方案,而且我对在这些不频繁的操作期间将这个特定的表锁定几分钟没有任何问题。问题是,给定的解决方案实际上对我不起作用。也许它是用来与旧版本的 Mysql 一起工作的东西?

增加锁缓冲区的大小
通过增加 Mysql 变量的值innodb_buffer_pool_size,我们可以为行锁创造更多的空间。我对这个解决方案感到非常不舒服,因为即使我可以分配足够的空间,随着表的增长,我也会为失败做好准备。此外,这似乎是一个糟糕的设置,需要创建千兆字节的可以说是不必要的锁。

索引受影响的列(见注释)
如果我们正在对适当索引支持的单个列进行批量更新,那么 InnoDB 可以避免锁定所有行。通过使用索引,它可以只锁定受影响的行。我实际上试过了,但发现管理这三个索引会使我的增量更新慢很多。由于我将有数以千万计的更新查询为需要重置计数的每个实例调整这三个计数,我不想牺牲增量更新的效率。

分批更新列
源文档将其描述为一种变通方法,但我发现它在某种程度上非常有效:

通过重复执行此操作,直到受影响的行数小于指定的limit,所有行都会得到更新。这个解决方案在特别大的表上对我来说失败了,因为 Mysql 必须进一步寻找匹配的行,因此可以在单次迭代中更新的行数急剧下降。到 1,000 行更新对于一次执行来说太多了,我仍然有数百万个非零值要更新。

那么我还剩下什么可能性呢?

  1. 停止使用 InnoDB:这需要对我当前的流程进行一些其他重组,但我会考虑这样做。
  2. 将计数列移出主表:如果我有一个 CountA 表,那么我可以通过使用重置计数,delete from CountA并且可以通过对主表的内部连接来检索计数。这会减慢我对单个计数的更新速度,因为在有条件地更新或在 CountA 表中插入一行之前,我必须从主表中获取 id。不是很好,但我会考虑。
  3. 其他既是干净的解决方案,又是可以预期与我的桌子一起合理增长的解决方案?

更新:在接受响应的帮助下,我现在有了一个批处理实现,它可以在大约五分钟内完成工作。尽管我更希望不需要批处理,但在出现更直接的解决方案之前似乎是这样。如果它有助于下一个人偶然发现这个问题,这是我相关的 Java JDBC 代码。(也建议阅读从已接受答案链接的博客文章。)

0 投票
2 回答
7633 浏览

java - 如何执行将列表作为参数值的 JPA 批量更新语句

我有一个看起来像这样的更新查询

所以JPA事务是

该方法的输入是 List id、currentStatus 和 updatedStatus

如何将列表作为单个参数传递,如果将列表转换为逗号分隔的字符串,则会收到错误指定文本不是数字,因为 In 子句中不允许使用字符串。

0 投票
3 回答
278 浏览

sql - 列复制和更新与列创建和插入

我在 PostgreSQL 9.2.10 中有一个包含 3200 万行和 31 列的表。我通过添加具有更新值的列来更改表。

例如,如果初始表是:

我正在修改表格,结果是:

我有将读取 initial_color 列并更新值的代码。

鉴于我的表有 3200 万行,并且我必须在 31 列中的 5 列上应用此过程,那么最有效的方法是什么?我目前的选择是:

  1. 复制列并更新新列中的行
  2. 创建一个空列并插入新值

我可以一次选择一列,也可以一次选择全部五列。列类型为character varyingcharacter

0 投票
1 回答
1029 浏览

mongodb - 基于更改 mongodb 中的查找/查询的批量更新

在 MongoDB 中,我知道可以像这样进行批量更新:

bulk.find( { status: "D" } ).update( { $set: { status: "I", points: "0" } } );

这将匹配“状态”为“D”的所有文档。

find是否可以在零件总是在变化的情况下执行类似的操作?

换句话说,我可以在一次操作中完成这一切吗?

0 投票
3 回答
671 浏览

mongodb - MongoDB 多个更新属性

我有一个集合 A,其中包含以下形式的文档:

和文件 B 的形式:

我想更新集合 A 以获得以下文件:

这时我用

,但我需要为我的所有文档循环运行 10,000 次。如何在 1 db 调用中或以最有效的方式更新多个文档(通过 _id)?(这基本上是一个加入/批量更新属性操作)

我使用 mongodb 2.6

0 投票
0 回答
56 浏览

duplicates - 更新多行的唯一列,跳过重复项

这是我的主

ID -> 主键列

移动 -> 一个独特的列

我有一个新的更新请求。数据位于另一个表中(比如 table dummy)。

要将数据从虚拟表更新到联系人,我可以通过连接这两个表轻松触发更新查询并更新联系人的移动。但只有当从虚拟表的 Mobile 列更新的数据是唯一的时才有可能。

也就是说,如果虚拟表内容如下所示,

在这种情况下,我想跳过第 1 行和第 3 行,只更新第二行。我需要更新 STATUS 列(已跳过或已更新)。

有可能通过几个查询吗?

0 投票
1 回答
859 浏览

c# - 如何在 ASP:ListView 中一次批量实现所有插入、更新、删除操作

我有一个 Asp:ListView 控件,我在 Web 表单的弹出窗口中显示该控件。目前,只要我单击插入、更新或删除链接按钮,它就会直接在数据库中进行所有更改。

但是只有在提交 Web 表单时,我才需要在数据库中完成所有更改。
所以,我想我需要在会话中保留绑定到 ListView 的数据,并且在所有插入、更新和删除操作中,通过
步骤 1)手动对 OnInserting、OnDeleting、OnUpdating 事件进行所有更改)检索每次来自 Session["ListView1"] 的数据,
步骤 2) 对检索到的数据执行插入/删除/更新操作
步骤 3) 将其绑定到 ListView
步骤 4) 更新后替换 Session["ListView1"] 中的数据。
第 5 步)在 Web 表单提交时,获取更新的数据并在数据库中全部替换?

我做了这些步骤,但它没有按预期工作。在更新时,ListView 显示 2 列的空白值并错误地绑定数据。我已经绑定了正确的列。插入后,TextBox 没有按预期更改为 Labels。下面是我的 ListView 和代码隐藏代码:

列表显示:

下面是代码背后的代码:

我究竟做错了什么?请帮忙。

非常感谢

0 投票
2 回答
4814 浏览

sql - Postgres 中的批量更新

我需要根据另一个表记录更新一个表记录。

我试过了

但给出错误(MySQL 和 SQL Server 的查询工作相同)。

然后我在下面尝试:

它正在工作,但速度很慢,我也需要为一些大桌子做这件事。

有任何想法吗?

0 投票
1 回答
1101 浏览

java - MS SQL 批量更新\插入

前段时间我们遇到了批量插入\更新到 MS SQL 数据库的问题。

任务非常简单——从数据库中检索数据,执行数据转换并更新父表并填写子表。数据量巨大,这就是我们对最高效的方式感兴趣的原因。DB 中的所有操作(存储过程、文件处理等)都不适用,因为我们需要从第三方应用程序获取信息。

虽然在互联网上你可以找到很多关于如何禁用自动提交和执行批量插入\更新的文章,但无论如何它都会一个接一个地发送请求。这适用于大多数免费的 jdbc 驱动程序,包括最流行的一个 - net.sourceforge.jtds.jdbc.Driver ( http://sourceforge.net/p/jtds/discussion/129584/thread/8e89906c/ )。可能 DataDirect 支持这样的功能,但它不是免费的。FIY - SQL Server 2008 的 JDBC 驱动程序列表(比较)

请分享解决类似问题的经验。

最好的问候,
亚历克斯

0 投票
2 回答
3225 浏览

java - Elasticsearch java批量更新插入异常

我正在尝试使用批量 API 批量更新现有索引,因此有些记录存在,需要更新,有些记录是新的,因为它们不存在,所以需要编制索引。我使用了以下代码

但是,有了这个,我得到以下异常

我猜新记录/新 docIds 是它失败的地方。知道如何批量实现 upsert(如果存在则更新,如果不存在则插入)?