Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于键列表更新多行的最佳实践_Java_Sql_Oracle_Sql Update - Fatal编程技术网

Java 基于键列表更新多行的最佳实践

Java 基于键列表更新多行的最佳实践,java,sql,oracle,sql-update,Java,Sql,Oracle,Sql Update,我很好奇,如果我有一个由外部系统提供的ID列表,那么更新数据库中多行的最佳实践是什么 简单更新表集y=z,其中id在;这不是我们能得到的超过图萨和ID的方法,这是神谕的极限 当然,我们有一些想法,比如通过使用临时表和EXIST条件将查询拆分为多个查询,但我希望看到最佳实践并了解其背后的理论 编辑:这个问题不是为了最快的答案而竞赛,而是关于最佳实践及其理论背景。ID由外部系统提供!没有用于联接或选择的其他表。所谓临时表,我指的是全局临时表oracle特性,而不是为每个查询创建和删除新表!请不要仅仅

我很好奇,如果我有一个由外部系统提供的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
                });
            });