我有一个包含大约500K+记录的DataTable,我想为DataTable中包含的每个记录更新数据库中的一个字段。
目前,我正在获取DataTable的ID列中所有记录的列表,并使用这些ID上的SQL in语句创建一条update语句,如下所示:
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中的数据包大小对于这个查询来说不够大。
除了增加数据包大小之外,还能做什么?这似乎是一种糟糕的方法。
发布于 2017-03-29 00:40:55
对于类似的任务,我曾经使用过以下方法:
update表创建包含列的附加表,并启动record_id bigint.
session_id GUID INNER JOIN 表中指定。
完成后,您可以开始研究性能:
DROP TABLE必须比DELETE FROM快得多,但在我的例子中,创建表的速度太慢,所以我更喜欢使用永久表);bigint而不是GUID-s来识别会话,因为它们必须更快地进行比较;COPY FROM (PostgreSQL)或BULK INSERT (MS SQL)语句,而不是INSERT INTO-s系列。不过,我没有在MySQL上找到类似的东西。我不知道哪种最适合你)
发布于 2017-03-28 15:30:31
我不知道是否有可能增加MySQL中的数据包大小,但是有一个简单的解决方案可以解决您的问题,方法是将您的更新查询划分为多组ID的多个更新查询
发布于 2017-03-28 15:31:16
假设id_list_table包含要在my_table中更新的in列表:
UPDATE my_table
SET my_field = @timestamp
JOIN id_list_table
ON my_table.id = id_list_table.my_table_idhttps://stackoverflow.com/questions/43063059
复制相似问题