ORACLE NOLOGGING研究

熟悉oracle的人都知道,通过设置oracle的nologging选项,可以使某些操作快速完成,风险是数据库备份可能失效。可以使用nologging的操作有很多,搜集资料整理如下:

1.索引的创建和ALTER(重建)。
2.表的批量INSERT(通过/*+append */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据生成少量redo,但是所有索引修改会生成大量redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。
3.Lob操作(对大对象的更新不必生成日志)。
4.通过create table as select创建表。
5.各种alter table操作,如move和split。

6. dml操作始终生成redo,对于lob字段例外(与lob字段的undo方式有关)

下面,我们来使用一下:

首先是归档模式下:

[sql] view plaincopyprint?

  1. SQL> show user
  2. USER is "YUE"
  3. SQL> @redo.sql
  4. STATISTIC# USERNAME                       NAME                      VALUE
  5. ---------- ------------------------------ -------------------- ----------
  6. 178 YUE                            redo size                   684
  7. SQL> create table t2 as select * from t1;
  8. Table created.
  9. SQL> @redo.sql
  10. STATISTIC# USERNAME                       NAME                      VALUE
  11. ---------- ------------------------------ -------------------- ----------
  12. 178 YUE                            redo size               8573344
  13. SQL> create table t3 nologging  as select * from t1;
  14. Table created.
  15. SQL> @redo.sql
  16. STATISTIC# USERNAME                       NAME                      VALUE
  17. ---------- ------------------------------ -------------------- ----------
  18. 178 YUE                            redo size               8725596

再来看一下非归档模式下:

[sql] view plaincopyprint?

  1. SQL> @redo.sql
  2. STATISTIC# USERNAME                       NAME                      VALUE
  3. ---------- ------------------------------ -------------------- ----------
  4. 178 YUE                            redo size                  1392
  5. SQL> create table t4 as select * from t1;
  6. Table created.
  7. SQL> @redo.sql
  8. STATISTIC# USERNAME                       NAME                      VALUE
  9. ---------- ------------------------------ -------------------- ----------
  10. 178 YUE                            redo size                191000
  11. SQL> create table t5 nologging as select * from t1;
  12. Table created.
  13. SQL> @redo.sql
  14. STATISTIC# USERNAME                       NAME                      VALUE
  15. ---------- ------------------------------ -------------------- ----------
  16. 178 YUE                            redo size                297176

由此可见,在非归档模式下,对于上述操作,oracle不管nologging是否指定,都尽量不生成redo。

那么,上面所有的可以nologging的操作具有什么共性那?

本人,认为,所有这些操作都是生成新的数据块或者直接覆盖老数据块的所有内容,例如 insert
append操作,是在高水位线上直接插入数据。这也就解释了为什么insert
append操作对应的index会生成redo,因为对index的修改即不是新建块也不是覆盖老块的所有内容。

DML操作在nologging模式下之所以生成日志,是因为dml操作的不一定是新块或者覆盖老块所有内容。而对lob的dml可以不生成redo,是因为lob的dml操作始终是在新块上保存编辑后数据。

时间: 2024-08-25 12:29:21

ORACLE NOLOGGING研究的相关文章

转载:oracle 启动过程--oracle深入研究

Oracle数据库的启动-nomount状态深入解析 通常所说的Oracle Server主要由两个部分组成:Instance和Database.Instance是指一组后台进程(在Windows上是一组线程)和一块共享内存区域:Database是指存储在磁盘上的一组物理文件.通过Instance与Database协同,Oracle数据库才能形成一个动态的可访问关系型数据库系统.本章将由数据库如何启动与关闭入手,开始和大家一起进入Oracle数据库的国度.1.1 数据库的启动从表象来看,数据库的

Oracle NoLogging Append 方式减少批量insert的redo_size

业务处理中,很多时候使用实表临时表处理中间结果,而实表的Insert操作缺省会记录redo log,针对此问题收集相关测试总结信息如下: [转] 常见dml.ddl语句使用nologging选项所生成的redo和undo大小比较 DDL/DML Operations Direct-path nologging parallel Noarchivelog Redo Noarchivelog Undo Archivelog Redo Archivelog Undo Insert into XXX s

oracle nologging用法(转)

一.oracle日志模式分为(logging,force logging,nologging) 默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nologging是尽量减少日志.FORCE LOGGING可以在数据库级别.表空间级别进行设定.而LOGGING与NOLOGGING可以在表级别设定. 注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLO

oracle nologging用法

一.oracle日志模式分为(logging,force logging,nologging) 默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nologging是尽量减少日志.FORCE LOGGING可以在数据库级别.表空间级别进行设定.而LOGGING与NOLOGGING可以在表级别设定. 注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLO

Oracle DBA面试突击题

一份ORACLE DBA面试题 一:SQL tuning 类 1:列举几种表连接方式 答:Oracle的多表连接算法有Nest Loop.Sort Merge和Hash Join三大类,每一类又可以分为三小类. 以Nest Loop为例: 传统的Nest Loop连接: 针对In.Exists优化的Semi Nest Loop: 专门针对Not In.Not Exists优化的Anti Nest Loop. Semi/Anti *** Join这几种也叫半连接. (可以补充一下这三个连接的不同之

oracle迁移到mysql(仅使用脚本)

一直用oracle,最近研究了下mysql,先列举下mysql奇怪的特性 1. 不能存储毫秒精度的时间. 2. 如果有varchar, char就会自动变varhar. 3. timestamp时间范围比datatime小,精度一样, 而且就算你不insert/update,它的值也会自动改变. 4. 没有sequence可以用. 下面说下步骤吧. 首先你得有个mysql,如果没有请参考安装步骤. 1. 导出表结构, 并且创建到Mysql 2. oracle spool 命令导出数据 3. my

数据库 基础题

一.选择题 1. 下面叙述正确的是___c___. A.算法的执行效率与数据的存储结构无关 B.算法的空间复杂度是指算法程序中指令(或语句)的条数 C.算法的有穷性是指算法必须能在执行有限个步骤之后终止D.以上三种描述都不对 2. 以下数据结构中不属于线性数据结构的是___c___.A.队列B.线性表C.二叉树D.栈 3. 在一棵二叉树上第5层的结点数最多是___b___.A.8 B.16 C.32 D.15 4. 下面描述中,符合结构化程序设计风格的是__a____. A.使用顺序.选择和重复

数据库基础(面试常见题)

一.数据库基础 1. 数据抽象:物理抽象.概念抽象.视图级抽象,内模式.模式.外模式 2. SQL语言包括数据定义.数据操纵(Data Manipulation),数据控制(Data Control) 数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等 数据操纵:Select ,insert,update,delete, 数据控制:grant,revoke 3. SQL常用命令: CREATE TABLE Student( I

PLSQL_Oracle 面试整理(汇总)(整理网上资料DBA and PLSQL面试大全)

2014-08-16 BaoXinjian 一.SQL Tunning类 1. 列举集中表的连接方式 Answer:等连接(内连接).非等连接.自连接.外连接(左.右.全) Or hash join/merge join/nest loop(cluster join)/index join ?? 连接类型 定义 例子 内连接 只连接匹配的行 select A.c1,B.c2 from A join B on A.c3 = B.c3; 左外连接 包含左边表的全部行(不管右边的表中是否存在与它们匹配