Java 基于键列表更新多行的最佳实践
我很好奇,如果我有一个由外部系统提供的ID列表,那么更新数据库中多行的最佳实践是什么 简单更新表集y=z,其中id在;这不是我们能得到的超过图萨和ID的方法,这是神谕的极限 当然,我们有一些想法,比如通过使用临时表和EXIST条件将查询拆分为多个查询,但我希望看到最佳实践并了解其背后的理论 编辑:这个问题不是为了最快的答案而竞赛,而是关于最佳实践及其理论背景。ID由外部系统提供!没有用于联接或选择的其他表。所谓临时表,我指的是全局临时表oracle特性,而不是为每个查询创建和删除新表!请不要仅仅因为你想快速回答或者你没有抓住要点而回答。你能用这个吗Java 基于键列表更新多行的最佳实践,java,sql,oracle,sql-update,Java,Sql,Oracle,Sql Update,我很好奇,如果我有一个由外部系统提供的ID列表,那么更新数据库中多行的最佳实践是什么 简单更新表集y=z,其中id在;这不是我们能得到的超过图萨和ID的方法,这是神谕的极限 当然,我们有一些想法,比如通过使用临时表和EXIST条件将查询拆分为多个查询,但我希望看到最佳实践并了解其背后的理论 编辑:这个问题不是为了最快的答案而竞赛,而是关于最佳实践及其理论背景。ID由外部系统提供!没有用于联接或选择的其他表。所谓临时表,我指的是全局临时表oracle特性,而不是为每个查询创建和删除新表!请不要仅仅
UPDATE table
SET a.column=b.column
FROM table a
JOIN your_id_table b ON a.id=b.id
您是如何填写in子句的?您可能在另一个表中列出了该列表,因此
UPDATE table
SET y=z
WHERE id IN (SELECT ID
FROM YourOtherTable);
也可以使用存在
编辑:我假设您正在使用Java进行更新 创建一个临时表,用您的ID填充它,然后针对它执行,不是需要更长的时间吗?或许我误读了这个场景 我要做的是将ID的大列表拆分为多个分区,然后使用执行器将批提交到我的DB层,例如:
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10);
List<Integer> aLotOfIds = new ArrayList<Integer>(); // imagine heaps of IDS
List<List<Integer>> partition = Lists.partition(aLotOfIds, 1000);
partition.forEach( p -> {
newFixedThreadPool.submit(() -> {
// execute update for a batch
});
});
可能的副本。数组将使您的更新成为更新表集合y=z,其中SELECT列中的id_value FROM table。此查询多久运行一次?如果此查询一天只运行几次,一些典型的最佳实践可能不适用;有几种方法,它们可以权衡简单性、编码/维护的容易性、速度、负载等。。。我会使用数组/表集合方法,但对其他我没有想到过,甚至没有听说过的方法可能有好处;我还没有对这些选项进行基准测试。这对我来说已经足够好了,但可能不适合你。有10-50台设备,每台设备的查询每分钟运行两次,可能会更多或更少,取决于配置。不,我没有其他表中的列表。请小心使用子查询,因为这是一个性能杀手。必须完全计算子查询,这可能需要一段时间。EXISTS alternative在这种情况下是更好、通常更快的方法,也是我将与存储ID的临时表一起使用的选项;所以你的id表不存在?您是在建议以某种方式填充一个临时表,还是一个表集合表达式,还是假设有一个真正的表要加入?作为建议的临时表,我指的是全局临时表Oracle特性。我将插入ID,我想更新,然后去更新使用条件存在。亚历克斯,我问清楚,他如何填写在他的IN子句空白,因为这将指向他是如何存储数据。正如Kousalik所描述的,它可能是一个表变量、临时表或永久表。并不意味着每次查询运行时都要创建和删除表。
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10);
List<Integer> aLotOfIds = new ArrayList<Integer>(); // imagine heaps of IDS
List<List<Integer>> partition = Lists.partition(aLotOfIds, 1000);
partition.forEach( p -> {
newFixedThreadPool.submit(() -> {
// execute update for a batch
});
});