我在徘徊在表和索引上使用 NOLOGGING 子句的实际目的是什么。
据我从 Oracle 文档中了解到的,我们可以防止数据库仅在直接路径模式下插入时生成重做日志。UPDATING 或 DELETING 时无法避免重做日志生成。
所以,我们通常写
INSERT /*+ APPEND NOLOGGING */ INTO TABLE ... ;
commit;
为了防止重做日志的产生。
我完全不明白在创建 TABLE 或 INDEX 时使用 NOLOGGING 子句的实际优势是什么,也没有在创建 TABLESPACES 时使用 NOLOGGING 子句来设置将在该表空间上创建的对象的默认值。
谁能描述一个实际场景,在数据库对象上设置这个子句可能会带来好处?
没有这样的提示
NOLOGGING
。当然,
UPDATE
andDELETE
操作不能利用NOLOGGING
,但是还有其他操作可以:日志记录子句
正如您所指出的,NOLOGGING 机制是为了避免生成重做日志信息,这可以使批量加载更快。
我通常将它用于大型装载工作。例如,加载 TB 的卫星图像:这意味着我会将 TB 位写入数据库(数据文件),但我也会将 TB 写入重做日志。这意味着日志上有额外的 I/O,以及用于归档日志的大量磁盘空间。
通过在加载期间禁用日志记录,我避免了那些额外的 I/O 和空间。
当然,这意味着,如果我完全丢失了媒体(= 一个磁盘驱动器无法修复),那么我将无法恢复:我可以从备份中恢复媒体,但我无法前滚失败的加载。这很好:从最后一个提交点重新启动加载比让数据库在 TB 和 TB 的日志中缓慢前进要快。
因此,基本上,在以下情况下,nologging 是有意义的:
CREATE TABLE AS SELECT
或INSERT SELECT