用相同的值更新 Oracle 中的多个记录的最有效方法是什么
What is the most efficient way of updating multiple records in Oracle with same value
我们有一个批处理作业需要用特定值更新 table 的数百万行(不是所有行)。
我们有以下实现:
我们处理例如一次 10K 条记录,并在 IN 子句中使用硬编码值触发更新查询,如下所示:
@Query("UPDATE Order or SET or.status= 'PROCESSED' WHERE or.orderId IN (:orderIds)")
@Modifying
void updateProcessedOrders(@Param("orderIds") List<String> orderIds);
第一个限制是 Update with IN 子句一次只能更新 1000 条记录。因此,我们必须将 ID 列表分成 1000 个一批,然后为每个 ID 创建一个更新查询。因此,我们必须触发 10 个更新查询,而不是一次查询 10k 个 orderIds。
这项工作在合理的时间内处理 10 到 1500 万条记录,但是对于其中一个客户来说,数据量高达 2 亿条。对于 2 亿,这项工作需要 2 天才能完成,这是 unacceptable.
所以我的问题是:
有没有更有效的方法来更新具有相同值的数百万条记录?
删除 IN 列表 中的 1000 个元素的一个选项是创建另一个 table,例如
create table order_ids (orderId number constraint pk_oid primary key);
并插入 所有 您正在使用的 ID 值。这意味着不是 1000 x 1000,而是一次需要多少(可能是数百万)。
然后
update order a set a.status = 'PROCESSED'
where exists (select null
from order_ids b
where b.orderId = a.orderId);
(table的主键意味着Oracle将隐式索引该列;如果允许重复,则删除主键并在该列上创建索引)。
我们有一个批处理作业需要用特定值更新 table 的数百万行(不是所有行)。
我们有以下实现:
我们处理例如一次 10K 条记录,并在 IN 子句中使用硬编码值触发更新查询,如下所示:
@Query("UPDATE Order or SET or.status= 'PROCESSED' WHERE or.orderId IN (:orderIds)")
@Modifying
void updateProcessedOrders(@Param("orderIds") List<String> orderIds);
第一个限制是 Update with IN 子句一次只能更新 1000 条记录。因此,我们必须将 ID 列表分成 1000 个一批,然后为每个 ID 创建一个更新查询。因此,我们必须触发 10 个更新查询,而不是一次查询 10k 个 orderIds。
这项工作在合理的时间内处理 10 到 1500 万条记录,但是对于其中一个客户来说,数据量高达 2 亿条。对于 2 亿,这项工作需要 2 天才能完成,这是 unacceptable.
所以我的问题是: 有没有更有效的方法来更新具有相同值的数百万条记录?
删除 IN 列表 中的 1000 个元素的一个选项是创建另一个 table,例如
create table order_ids (orderId number constraint pk_oid primary key);
并插入 所有 您正在使用的 ID 值。这意味着不是 1000 x 1000,而是一次需要多少(可能是数百万)。
然后
update order a set a.status = 'PROCESSED'
where exists (select null
from order_ids b
where b.orderId = a.orderId);
(table的主键意味着Oracle将隐式索引该列;如果允许重复,则删除主键并在该列上创建索引)。