【问题标题】:Oracle 12c - refreshing the data in my tables based on the data from warehouse tablesOracle 12c - 根据仓库表中的数据刷新我的表中的数据
【发布时间】:2016-12-17 06:38:58
【问题描述】:

我需要从每周或每两周更新一次的其他一些仓库表更新我的应用程序中的一些表。我应该根据这些更新我的表格。这些在另一个表中有外键。所以我不能每次都截断表格并重新插入整个数据。所以我必须根据几个不变的主键列来获取增量并相应地更新。需要一些关于如何实施这种方法的意见。

我的做法:
检查这些表、视图的最后更新时间。
如果是最新的,则根据我的表和仓库表中的主键比较每一行。
如果每列不同,请更新它。
如果列没有变化,则不执行任何操作。
如果有新记录则插入。

我的问题:
我该如何实施?编写 PL/SQL 代码是一种好且有效的方法吗?因为预期的记录数约为 800K。
请提供任何示例代码或链接。

【问题讨论】:

  • 其他仓库的每条记录上没有时间戳可以用来判断哪些行是相关的?单个合并语句将是第一个尝试的方法。然后尝试并行化;合并 /*+ 并行 */
  • 这个问题需要广泛(恕我直言)来回答。最好的解决方案甚至可以从一个表到另一个表使用不同的方法,具体取决于它们的结构、约束、行数和大小……您可以尝试选择一两个表作为示例,发布它们的结构、大小、索引和一些代码来完成任务,寻求帮助来改进你的代码。另外,考虑到 800K 并没有那么多。
  • 您的目标表只是源表的副本吗?您需要更新目标表还是它们只是只读的?如果您使用的是企业版,则物化视图可能非常适合您:docs.oracle.com/database/121/REPLN/repmview.htm#REPLN003
  • Materialized Views?在下班时间每天刷新仅更新增量...如果您必须拥有自己的“表格”,那么merge?

标签: oracle plsql oracle12c


【解决方案1】:

我会选择 Pl/Sql 和批量收集 forall 方法。您可以在光标中使用减号以减少数据大小和计算差异。

您可以查看此站点以获取有关批量收集、forall 和引擎的更多信息:http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html

【讨论】:

    【解决方案2】:

    您的问题有很多部分,我会尽我所能回答:

    1. 虽然可以禁用引用外键、截断表、使用更新的数据重新填充表然后重新启用外键,但鉴于上述要求,我不认为每次截断表都是最佳的李>
    2. 是的,原则上 PL/SQL 是实现您想要的目标的好方法 实现,因为这在原生 SQL 中太复杂而无法处理,而 PL/SQL 是一种有效的替代方法

    从概念上讲,我将采取的方法如下:

    初始设置:

    1. 创建一个名为 activity_seq 的序列
    2. 使用唯一约束向源表添加类型为 number 的“activity_id”列
    3. 为表行的每次插入/更新添加一个触发器到源表设置 activity_id = activity_seq.nextval
    4. 创建某种主表来保存“最后处理的活动 ID”值

    然后双/周:

    1. 从主服务器检索“最后处理的活动 id”的值 表
    2. 选择源表中所有具有 activity_id 值的行 >“最后处理的活动 id”值
    3. 如果根据您的匹配标准找到匹配项,或者如果找到匹配项,则遍历选定的源行并更新目标 没有找到匹配项然后在目标中插入一个新行(我假设 没有删除,因为你没有提到它)
    4. 完成后,将主表“上次处理的活动 ID”更新为源行的最大活动 ID 值 在上述第 3 步中处理。

    (请注意,根据您的环境和处理的行数,上述过程可能需要拆分并在多个事务中重复)

    我希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2020-02-18
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多