【问题标题】:Efficient way to update a database via an ETL process?通过 ETL 流程更新数据库的有效方法?
【发布时间】:2020-10-14 02:52:20
【问题描述】:

我有这个从源(例如,源代码存储库)中提取组件的工作流程。然后,它将它们与数据库中的持久组件进行比较,并传播任何添加、修改和删除。我有以下算法:

propagate(components) {
    
    // Bulk replace
    for (component in components) {
     componentName = component.getName();
     if !componentPersistence.get(componentName).equals(componentName)
        componentPersistence.update(component);
     else
        componentPersistence.add(component);
    }

    componentPersistence.deleteAllExcept(components);    
}

什么是这个程序更有效的实现方式?

【问题讨论】:

  • 为什么用 java 标记?

标签: java database performance


【解决方案1】:

我认为一种方法是这样的:

  1. 将所有组件插入临时表(temp_components)

  2. 删除 temp_components 中不存在的所有组件

delete from components c
where not exists (select 1 from temp_components t where t.name =
c.name)
  1. 更新 temp_components 中存在的所有组件
update components c
set field = (select t.field from temp_components t where t.name = c.name)
where exists (
 select 1 from temp_components t where t.name = c.name
)
  1. 插入组件表中不存在的所有 temp_components
insert into components (name, field)
select t.name, t.field
from temp_compoments t
where not exists (
 select 1 from component c where c.name = t.name
)
  1. 删除临时表

如果您使用的是 oracle,则可以使用 MERGE 操作进行插入和更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多