2011-10-05 80 views
0

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

因此,旧表的旧数据。

新表格必须包含旧数据,但它需要大量连接才能将旧数据正确地存入新表格。

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

谢谢。

回答

1

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

如果你 插入/ * + APPEND * /成target_table选择....从来源1,源2 ......,sourceN其中

它应该工作的罚款。但请考虑一下,负载的性能将受到该查询性能的限制,因此,如果您期望获得良好的性能,请确保它的调整良好。

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

希望帮助,

马克

+0

这是否意味着我永远不能备份数据库或东西吗?对不起,我不明白。 – johnny

2

在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直接加载后立即进行备份。如果您从之后的备份中恢复/恢复负载,则没有问题,因为数据将位于已恢复的文件中的数据块中。

希望是十分明显的,

马克

相关问题