首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新多行

问更新多行
EN

Stack Overflow用户
提问于 2017-03-28 15:21:49
回答 3查看 121关注 0票数 0

我有一个包含大约500K+记录的DataTable,我想为DataTable中包含的每个记录更新数据库中的一个字段。

目前,我正在获取DataTable的ID列中所有记录的列表,并使用这些ID上的SQL in语句创建一条update语句,如下所示:

代码语言:javascript
复制
string sql = "UPDATE my_table SET my_field = @timestamp WHERE id IN (" + String.Join(", ", myDataTable.AsEnumerable().Select(r => r.Field<Int64>("id")).ToList().ToArray()) + ")";

这对一些记录有效,但是由于is的数量很大,我现在收到一个错误,说MySQL中的数据包大小对于这个查询来说不够大。

除了增加数据包大小之外,还能做什么?这似乎是一种糟糕的方法。

EN

回答 3

Stack Overflow用户

发布于 2017-03-29 00:40:55

对于类似的任务,我曾经使用过以下方法:

update表创建包含列的附加表,并启动record_id bigint.

  • Before操作生成此操作的唯一标识符您必须将所有id连同生成的会话主表一起更新到此表中,并使用会话id将特定会话从
  1. session_id GUID INNER JOIN

表中指定。

完成后,您可以开始研究性能:

  • 关闭了会话表的日志记录,因为它不包含任何必要的data;
  • experiment,每次需要时创建临时表,而不是使用静态表(理论上它会简化清理,因为DROP TABLE必须比DELETE FROM快得多,但在我的例子中,创建表的速度太慢,所以我更喜欢使用永久表);
  • 使用bigint而不是GUID-s来识别会话,因为它们必须更快地进行比较;
  • 使用COPY FROM (PostgreSQL)或BULK INSERT (MS SQL)语句,而不是INSERT INTO-s系列。不过,我没有在MySQL上找到类似的东西。

我不知道哪种最适合你)

票数 1
EN

Stack Overflow用户

发布于 2017-03-28 15:30:31

我不知道是否有可能增加MySQL中的数据包大小,但是有一个简单的解决方案可以解决您的问题,方法是将您的更新查询划分为多组ID的多个更新查询

票数 0
EN

Stack Overflow用户

发布于 2017-03-28 15:31:16

假设id_list_table包含要在my_table中更新的in列表:

代码语言:javascript
复制
UPDATE my_table
SET my_field = @timestamp
JOIN id_list_table
ON my_table.id = id_list_table.my_table_id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43063059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档