APPEND HINTS 总结:

 APPEND 属于direct insert。归档模式下append+table nologging会大量减少日志, 非归档模式append会大量减少日志,append方式插入只会产生很少的undo。

APPEND的优势:

一是减少对空间的搜索,直接在高水位之上插入。

二是NOLOGGING会大大减少redo log的产生。

缺点:

浪费空间,使表的空间占用量大大增加。除非表只增加不删除。
普通INSERT 默认会从delete掉的空块中插入数据。  

--以下是是测试: 


  1. --ORACLE版本
  2. SQL> SELECT * FROM V$VERSION;

  3. BANNER
  4. ----------------------------------------------------------------
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
  6. PL/SQL Release 10.2.0.1.0 - Production
  7. CORE 10.2.0.1.0 Production
  8. TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
  9. NLSRTL Version 10.2.0.1.0 - Production

  10. ----非归档模式,
  11. SQL> SELECT NAME,LOG_MODE FROM V$DATABASE;

  12. NAME LOG_MODE
  13. --------- ------------
  14. ORCL NOARCHIVELOG

  15. --创建两个测试表
  16. SQL> CREATE TABLE T1 TABLESPACE TEST AS SELECT * FROM DBA_OBJECTS WHERE 1=2;

  17. 表已创建。

  18. SQL> CREATE TABLE T2 TABLESPACE TEST AS SELECT * FROM DBA_OBJECTS WHERE 1=2;

  19. 表已创建。

  20. --记录当前的sesison的redo size

  21. SQL> SELECT A.SID,B.NAME,A.VALUE FROM V$MYSTAT A, V$STATNAME B WHERE A.STATISTIC# = B.STATISTIC#
  22.   2 AND B.STATISTIC# = 134;

  23.        SID NAME VALUE
  24. ---------- ----------------------- ----------
  25.        144 redo size 89016
  26. ----普通insert
  27. SQL> INSERT INTO T1 SELECT * FROM DBA_OBJECTS;

  28. 已创建52019行。

  29. SQL> COMMIT;

  30. 提交完成。
  31. ----查看产生的redo size。(减去上面的redo size 89016,值为 5928472)
  32. SQL> SELECT A.SID,B.NAME,A.VALUE FROM V$MYSTAT A, V$STATNAME B WHERE A.STATISTIC# = B.STATISTIC#
  33.   2 AND B.STATISTIC# = 134;

  34.        SID NAME VALUE
  35. ---------- ----------------------- ----------
  36.        144 redo size 6017488
  37.        
  38. ---append模式的 insert语句

  39. SQL> INSERT /*+ APPEND */INTO T2 SELECT * FROM DBA_OBJECTS;

  40. 已创建52018行。

  41. SQL> COMMIT;

  42. 提交完成。
  43. --查看产生的redo size。(减去上面的redo size 6017488,值为 63584)

  44. SQL> SELECT A.SID,B.NAME,A.VALUE FROM V$MYSTAT A, V$STATNAME B WHERE A.STATISTIC# = B.STATISTIC#
  45.   2 AND B.STATISTIC# = 134;

  46.        SID NAME VALUE
  47. ---------- --------------------------- ----------
  48.        144 redo size 6081072
  49.        
  50. ---修改数据库为归档模式,测试append的影响
  51. SQL> SHUTDOWN IMMEDIATE
  52. SQL> STARTUP MOUNT
  53. ORACLE 例程已经启动。
  54. SQL> ALTER DATABASE ARCHIVELOG;
  55. SQL> ALTER DATABASE OPEN;
  56. SQL> SELECT NAME,LOG_MODE FROM V$DATABASE;

  57. NAME LOG_MODE
  58. --------- ------------
  59. ORCL ARCHIVELOG
  60. ----截断表
  61. SQL> TRUNCATE TABLE T1;

  62. 表被截断。

  63. SQL> TRUNCATE TABLE T2;

  64. 表被截断。
  65. ---查看当前redo size
  66. SQL> SELECT A.SID,B.NAME,A.VALUE FROM V$MYSTAT A, V$STATNAME B WHERE A.STATISTIC# = B.STATISTIC#
  67.   2 AND B.STATISTIC# = 134;

  68.        SID NAME VALUE
  69. ---------- --------------------------- ----------
  70.        159 redo size 0

  71. --普通insert 产生的redo size 5830728
  72. SQL> INSERT INTO T1 SELECT * FROM DBA_OBJECTS;

  73. 已创建52018行。

  74. SQL> COMMIT;

  75. 提交完成。

  76. SQL> SELECT A.SID,B.NAME,A.VALUE FROM V$MYSTAT A, V$STATNAME B WHERE A.STATISTIC# = B.STATISTIC#
  77.   2 AND B.STATISTIC# = 134;

  78.        SID NAME VALUE
  79. ---------- ------------------------- ----------
  80.        159 redo size 5830728
  81. --修改表t2为nologging的属性,记录当前redo size
  82. SQL> alter table t2 nologging;

  83. 表已更改。

  84. SQL> SELECT A.SID,B.NAME,A.VALUE FROM V$MYSTAT A, V$STATNAME B WHERE A.STATISTIC# = B.STATISTIC#
  85.   2 AND B.STATISTIC# = 134;

  86.        SID NAME VALUE
  87. ---------- --------------- ----------
  88.        159 redo size 11796512
  89. --APPEND 模式 insert 产生的redo size 为63616(11860128-11796512)
  90. SQL> INSERT /*+ APPEND */INTO T2 SELECT * FROM DBA_OBJECTS;

  91. 已创建52018行。

  92. SQL> commit;

  93. 提交完成。

  94. SQL> SELECT A.SID,B.NAME,A.VALUE FROM V$MYSTAT A, V$STATNAME B WHERE A.STATISTIC# = B.STATISTIC#
  95.   2 AND B.STATISTIC# = 134;

  96.        SID NAME VALUE
  97. ---------- --------------- ----------
  98.        159 redo size 11860128
  99. --修改表 t2 logging的模式
  100. SQL> ALTER TABLE T2 LOGGING;

  101. 表已更改。
另外对nologging的一点使用记录:

DML statements (UPDATE, DELETE, and conventional path insert) are unaffected by the NOLOGGING attribute of the table and generate redo.

The logging_clause lets you specify whether creation of a database object will be logged in the redo log file (LOGGING) or not (NOLOGGING).

 

You can specify the logging_clause in the following statements:

CREATE TABLE and ALTER TABLE

CREATE INDEX and ALTER INDEX

CREATE MATERIALIZED VIEW and ALTER MATERIALIZED VIEW

CREATE MATERIALIZED VIEW LOG and ALTER MATERIALIZED VIEW LOG

CREATE TABLESPACE and ALTER TABLESPACE

SQL*Loader and direct load INSERT operations

This has the following benefits:

Space is saved in the redo log files.

The time it takes to create the table is decreased.

Performance improves for parallel creation of large tables.

09-02 06:51