在 Oracle 中追加提示

问题描述 投票:0回答:1

我正在使用 insert into using select statement in package 将大量记录从一个表插入到另一个表中。我在 select 语句中使用多线程。我应该在插入语句中使用 /*+ APPEND NOLOGGING */ 提示吗?在 oracle 的全局临时表上创建索引真的能提高性能吗?

oracle append oracle10g hint global-temp-tables
1个回答
0
投票

APPEND
提示的性能改进可能有多种原因。启用直接路径写入允许 Oracle 避免写入数据的多个副本,例如重做、撤消和归档日志。直接路径写入还可以启用压缩、自动统计信息收集和其他优化。但要注意直接路径写入的重要缺点:更改在下一次备份之前not 可恢复,并且表完全锁定直到
COMMIT
.

如果您已经在读取上使用多线程,那么您也可以使用像

INSERT /*+ APPEND PARALLEL(8) */ ...
这样的提示来使用多线程写入。但是您可能需要使用
ENABLE_PARALLEL_DML
提示或在会话级别启用并行 DML。

很有可能

APPEND
提示最初不会提高性能,因为直接路径写入有很多限制,例如没有日志记录属性(如果您的数据库处于存档日志模式)、触发器、外键等。 (请注意,
LOGGING
not 是一个提示,它是一个对象属性。)

仔细查看您的执行计划以确保您获得直接路径写入。您应该看到一个名为

LOAD AS SELECT
的操作,而不是
LOAD TABLE CONVENTIONAL
以确保使用直接路径写入。你应该在任何你想要并行化的操作之前看到一个
PX ...
操作。

如果您使用的是现代版本的 Oracle,执行计划的

Note
部分可能会告诉您为什么没有获得直接路径写入或并行性。 SQL Monitor Report(通过
DBMS_SQLTUNE.REPORT_SQL_MONITOR
生成)可以帮助您识别并行度问题和其他性能问题。

在许多系统上,您可以将

INSERT
性能提高 100 倍或更多,但这可能需要付出很多努力。

© www.soinside.com 2019 - 2024. All rights reserved.