我正在使用insert into使用select语句从一个表插入到另一个表中。我在选择语句中使用多线程。我应该在插入语句中使用/*+ APPEND NOLOGGING */提示吗?它真的能提高性能吗?在oracle全局临时表上创建索引是不是一个好主意?
APPEND
提示的性能改进可能有多种原因。启用直接路径写入允许Oracle避免写入多个数据副本,例如重做,撤销和归档日志。直接路径写入还可以支持压缩、自动统计信息收集和其他优化。但是要注意直接路径写入的重要缺点:在下一次备份之前,更改是不可可恢复的,并且表被完全锁定,直到COMMIT
。
如果你已经在读操作中使用多线程,你也可以使用多线程写操作,比如INSERT /*+ APPEND PARALLEL(8) */ ...
。但是您可能需要在会话级别使用ENABLE_PARALLEL_DML
提示或启用并行DML。
很有可能APPEND
提示最初不会提高性能,因为直接路径写入有许多限制,例如没有日志记录属性(如果您的数据库处于archivelog模式),触发器,外键等(注意LOGGING
是不是提示,它是对象属性)。
仔细查看你的执行计划,确保你得到了直接路径写入。您应该看到一个名为LOAD AS SELECT
而不是LOAD TABLE CONVENTIONAL
的操作,以确保使用了直接路径写操作。在你想要并行化的任何操作之前,你应该看到一个PX ...
操作。
如果你使用的是现代版本的Oracle,执行计划的Note
部分可能会告诉你为什么你没有得到直接路径写或并行。SQL Monitor Report(通过DBMS_SQLTUNE.REPORT_SQL_MONITOR
生成)可以帮助您识别并行度问题和其他性能问题。
在许多系统上,您可以将INSERT
性能提高100倍或更多,但这可能需要付出很多努力。