【问题标题】:Best approach for Oracle database mass updateOracle 数据库批量更新的最佳方法
【发布时间】:2013-04-19 02:50:50
【问题描述】:

我需要对 Oracle 10g 数据库中的表(约 30,000 条记录)进行大规模更新。挑战在于没有可以选择目标行的“where”子句。但是,每个目标行都可以通过复合键来标识。这里的问题是复合键列表来自外部源(不在数据库中)。

目前我有一个 Java 程序,它遍历复合键列表并输出一个 PL/SQL 过程,该过程本质上只是一堆重复的 update 语句,类似于以下内容:

update table1 t set myfield='Updated' where t.comp_key1='12345' and t.comp_key2='98765';

有没有更好的方法来做到这一点,或者考虑到我们只处理大约 3 万条记录,这是否“足够好”?

【问题讨论】:

  • 你可以使用... where (t.comp_key1, t.comp_key2) in (('12345', '98765'), ('11111', '11111'), ('22222', '22222'))之类的东西一次做一堆。您可以更新的行数将取决于语句的最大长度(这将由您的 Java 数据驱动程序确定),但您应该能够在每个语句中获得 100 或更多行。它不漂亮,但你可以节省很多往返行程。
  • 或者您可以将整个批次解析到数据库中并使用table function

标签: sql oracle plsql oracle10g


【解决方案1】:

可能已经足够好,但如果键的外部来源是文件,请创建一个指向该文件的外部表,将文件中的数据公开为关系表,然后您可以在合并中执行此操作(更新)声明。

【讨论】:

    【解决方案2】:

    够了。

    使用主键的 30,000 次更新,即使它们都是硬解析的,通常也只需要几秒钟。正如@Ed Gibbs 建议的那样,您可能可以通过组合更新来加快速度。但到目前为止,这看起来是一个非常快速的过程,不值得优化。将所有这些都放在一个 PL/SQL 过程中是明智之举,并且节省了 99% 的时间,而这对于真正简单的、逐行从客户端的解决方案来说是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2013-03-26
      • 2012-08-06
      • 1970-01-01
      • 2016-06-15
      相关资源
      最近更新 更多