Sur*_*tam 1 performance oracle
Oracle 数据库处于开启noarchivelog模式,并tablespace配置了nologging选项,保持不会出现恢复任何数据的情况。
ETL过程中发生了以下场景:
我想知道为什么在这种情况下会生成如此大量的重做。
考虑以下过度重做的上下文:
NOLOGGING无论如何不适用于由MERGE语句产生的任何 UPDATE 操作。/*+ APPEND */插入语句的提示来绕过日志记录,即使 nologging 选项在表/表空间级别处于活动状态也是如此。问题:
1, 2 and 3除了生成如此大容量的 REDO之外,任何人都可以看到任何其他考虑因素吗?非常感谢对上述问题和考虑的任何建设性答案,以便如果我错了,我可以纠正自己。
为了深入了解这个问题,您可能需要识别生成 REDO 的 SQL 语句。不幸的是,我认为没有任何简单、完全自动化的方法来检测每个 SQL 的 REDO。
但追踪最糟糕的 SQL 语句通常并不困难。由于您已经有了 AWR,请查看 SQL 统计信息部分,按已用时间排序。如果有很多 REDO,那么其中一个语句可能会突出。例如,如果顶部语句是UPDATE、DELETE、MERGE (UPDATE)或 ,INSERT不带提示(或带错误提示)。
可能最上面的语句都是 CTAS 或INSERT /*+ APPEND */. 在这种情况下,请查看每个顶级语句的解释计划,例如使用“select * from table(dbms_xplan.display_awr(sql_id => 'sql_id from AWR')); 如果执行计划表示LOAD AS SELECT那么它正在使用直接路径插入并且可以”。如果它说LOAD TABLE CONVENTIONAL,那就是问题陈述。
可能它们都没有问题,但是 REDO 是由索引生成的。索引不会生成 REDO 的唯一方法是索引设置为NOLOGGING并且索引是在INSERT. 索引NOLOGGING仅适用于索引DDL。您可能需要删除/禁用并重新创建/重建索引以减少 REDO。
INSERT根据我的经验,语句未在直接路径写入中运行的最可能原因是:
/* +。或者如果提示放置在稍微错误的位置,就像这样
INSERT INTO /*+ append */ ...。把完整的SQL语句和执行计划贴出来,我们或许可以帮助调查。
如果这些都没有帮助,那么可能是 AWR 错误。每秒 15GB 非常高,但并非不可能。如果 Exadata 系统能够实现这一点,我不会感到太惊讶。