【问题标题】:Can you using joins with direct path inserts?您可以使用带有直接路径插入的连接吗?
【发布时间】:2011-12-01 13:01:44
【问题描述】:

我试图找到示例,但它们都很简单,只有一个 where 子句。这是情况。我有一堆从另一个数据库传输的遗留数据。我在同一个数据库中也有“好”表。我需要将(数据转换)数据从旧表传输到 w 表。因为这是一组不同的表,所以数据转换需要复杂的连接才能将旧数据正确地放入新表中。

所以,旧表旧数据。

新表必须有旧数据,但它需要大量连接才能将旧数据正确地放入新表中。

我可以使用包含很多这样的连接的直接路径吗? INSERT SELECT(大量连接) 直接路径是否适用于已经在同一个数据库上的表(表之间的传输)?是否仅用于从文本文件中加载表格?

谢谢。

【问题讨论】:

    标签: oracle direct-path


    【解决方案1】:

    您的 SELECT 中的查询可以像您希望的一样复杂,使用直接路径插入。直接路径仅指目标表。它与读取或处理数据的方式无关。

    如果您正在执行直接路径插入,则要求 Oracle 将新数据插入到表的高水位线之上,这样您就可以绕过将现有块中的空间重用于要插入的新行的正常代码.它还必须阻止其他插入,因为您不能在直接路径插入期间更改表的高水位线。如果您有一个用于加载的停机时间窗口,这可能没什么大不了的,但如果您希望现有表在加载期间可用于其他应用程序,这将是一个很大的问题。

    【讨论】:

      【解决方案2】:

      不,相反,这意味着您需要在NOLOGGING加载后进行备份,而不是您无法备份数据库。

      请允许我详细说明一下。通常,当您在 Oracle 中执行 DML 时,您所做更改的前图像会记录在 UNDO 中,并且所有更改(包括 UNDO 更改)首先写入 REDO。这就是 Oracle 管理事务、实例恢复和数据库恢复的方式。如果一个事务被中止或回滚,Oracle 使用 UNDO 中的信息来撤消事务所做的更改。如果实例崩溃,那么在实例重新启动时,Oracle 将使用 REDO 和 UNDO 中的信息恢复到最后提交的事务。首先,Oracle 会读取 REDO 并前滚,然后,使用 UNDO 回滚所有在崩溃时未提交的事务。通过这种方式,Oracle 能够恢复到最后提交的事务。

      现在,当您在插入语句上指定 APPEND 提示时,Oracle 将直接加载执行 INSERT。这意味着数据从高水位线上方加载到全新的、从未使用过的块中。因为正在加载的块是全新的,没有“前映像”,所以,Oracle 可以避免写 UNDO,从而提高性能。如果数据库处于 NOARCHIVELOG 模式,那么 Oracle 也不会写入 REDO。在处于 ARCHIVELOG 模式的数据库上,Oracle 仍将写入 REDO,除非在执行 insert /*+ append */ 之前将表设置为 NOLOGGING(即 alter table tab_name nologging;)。在这种情况下,表的 REDO 日志记录被禁用。但是,这是您可能遇到备份/恢复问题的地方。如果您执行 NOLOGGING 直接加载,然后遇到介质故障,并且包含具有 nologging 操作的段的数据文件从 nologging 加载之前的备份中恢复,那么重做日志将 不包含恢复该段所需的更改。那么,会发生什么?好吧,当您执行 NOLOGGING 加载时,Oracle 会将范围失效记录写入重做日志,而不是实际更改。然后,如果您在恢复中使用该重做,这些数据块将被标记为逻辑损坏。针对该段的任何后续查询都会出现 ORA-26040 错误。

      那么,如何避免这种情况呢?好吧,您应该始终在任何 NOLOGGING 直接加载后立即进行备份。如果您在 nologging 加载后从备份中恢复/恢复,则没有问题,因为数据将位于已恢复文件的数据块中。

      希望这很清楚,

      -马克

      【讨论】:

        【解决方案3】:

        是的,查询复杂度不应有任何任意限制。

        如果你这样做 insert /*+ APPEND */ into target_table select .... from source1, source2..., sourceN where

        它应该可以正常工作。但请考虑,加载的性能将受到该查询性能的限制,因此,如果您期望获得良好的性能,请确保对其进行了良好的调整。

        最后,考虑在目标表上设置 NOLOGGING 是否会显着提高性能。但是,如果您决定实施 NOLOGGING,还要考虑备份恢复的影响。

        希望对你有帮助,

        -马克

        【讨论】:

        • 这是否意味着我永远无法备份数据库之类的?对不起,我不明白。
        猜你喜欢
        • 2013-06-18
        • 1970-01-01
        • 2019-10-03
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 2015-02-08
        相关资源
        最近更新 更多