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