`

Oracle Append Hints

 
阅读更多
 APPEND HINTS 总结:

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

APPEND的优势:

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

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

缺点:

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

 

 

--以下是是测试:

 

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

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

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

NAME      LOG_MODE
--------- ------------
ORCL      NOARCHIVELOG

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

表已创建。

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

表已创建。

--记录当前的sesison的redo size

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

       SID NAME                      VALUE
---------- ----------------------- ----------
       144 redo size                 89016
----普通insert
SQL> INSERT INTO T1 SELECT * FROM DBA_OBJECTS;

已创建52019行。

SQL> COMMIT;

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

       SID NAME                     VALUE
---------- ----------------------- ----------
       144 redo size                6017488
       
---append模式的 insert语句

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

已创建52018行。

SQL> COMMIT;

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

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

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

NAME      LOG_MODE
--------- ------------
ORCL      ARCHIVELOG
----截断表
SQL> TRUNCATE TABLE T1;

表被截断。

SQL> TRUNCATE TABLE T2;

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

       SID NAME                        VALUE
---------- --------------------------- ----------
       159 redo size                    0

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

已创建52018行。

SQL> COMMIT;

提交完成。

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

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

表已更改。

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

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

已创建52018行。

SQL> commit;

提交完成。

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

       SID NAME                 VALUE
---------- --------------- ----------
       159 redo size         11860128
--修改表 t2 logging的模式
SQL> ALTER TABLE T2 LOGGING;

表已更改。

 

另外对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.

 

分享到:
评论

相关推荐

    /* append*/ oracle append 知识点

    ### Oracle Append 模式详解 #### 一、概述 在Oracle数据库中,`/*append*/` 是一种特殊的提示,用于指示数据库使用特定的方式执行插入操作。这种插入方式被称为 **Append Mode** 或 **Direct Path Insert**。它能...

    Hints优化.pdf

    Oracle Hints是Oracle数据库中一种用于优化SQL查询的工具。它们允许数据库管理员和开发人员提供关于如何执行SQL语句的提示,以此来改善查询性能。Oracle Hints在处理复杂SQL语句或特定类型的数据库操作时尤其有用,...

    前端开源库-vue-append

    【Vue.js 开源库——Vue-append 深度解析】 Vue.js 是一款广泛使用的前端JavaScript框架,它以其轻量级、高效以及易于学习的特点深受开发者喜爱。在Vue.js的生态系统中,存在许多优秀的开源库,它们扩展了Vue的核心...

    Append原理Append原理

    Append原理是Oracle数据库中的一种高效插入数据的方法。它通过绕过回滚段,减少了undo和redo的生成,从而提高了数据插入的速度。 Append原理的主要特点是: 1. 绕过回滚段:Append操作不操作回滚段,这使得数据...

    关于jquery append() html时的小问题的解决方法

    append()函数在jQuery中被广泛用于向选定的元素内部追加内容,这是一个非常方便的操作,可以帮助开发者以非常简单的方式动态生成网页内容。然而,在特定的情况下,append()函数可能会出现一些意外的行为。 首先,...

    3、通过datax同步oracle相关-oracle到hdfs

    对于HDFS的写入器,`defaultFS`是HDFS的默认文件系统地址,`path`指定数据保存的目录,`fileName`是生成文件的名称,`fileType`定义文件类型,如文本或二进制,`writeMode`可以是“append”、“overwrite”等。...

    arcgis下append面图层

    本文将详细介绍在ArcGIS中如何进行“append面图层”的操作,即如何将多个面图层合并成一个单一的图层,同时保持或更新属性表。 首先,我们可以采用ArcToolbox中的工具来实现这一目标。在ArcToolbox中,找到...

    java代码oracle数据库批量插入

    ### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...

    O_APPEND与读操作

    本主题聚焦于`O_APPEND`标志和`lseek`函数在文件访问中的行为,特别是它们如何影响读写操作。 `O_APPEND`是一个在`open`函数中使用的标志,用于指定打开文件的方式。如果设置了这个标志,每次对文件进行写操作(如`...

    oracle dbms_lob

    Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...

    appendData异步加载大数据量分片加载数据和增量渲染的解决方案

    "appendData异步加载大数据量分片加载数据和增量渲染的解决方案"是Echarts为优化性能提供的一种高效策略,尤其适用于展示百万级甚至千万级的数据集。本文将深入探讨这一高级进阶技巧。 首先,我们来理解"appendData...

    java连接Oracle分页显示

    在Java编程中,连接Oracle数据库并实现分页显示是一项常见的任务。这涉及到对数据库的查询操作,特别是当数据量较大时,为了提高用户体验和系统性能,分页展示数据显得尤为重要。Oracle数据库支持多种方式进行分页,...

    Guid转换为oracle存储格式

    sb.Append(guidBytes[i].ToString("x2")); } return sb.ToString().ToLower(); // Oracle通常要求十六进制字符串小写 } } // 使用示例 Guid myGuid = Guid.NewGuid(); string oracleFormat = ...

    Append.c源文件

    Append.c源文件

    delphi使用oadc操作oracle数据库

    OracleTable1.Append; OracleTable1.FieldByName('employee_name').Value := '张三'; OracleTable1.FieldByName('salary').Value := 5000; OracleTable1.Post; ``` 3. **更新(UPDATE)**:修改现有记录时,先...

    excel中数据写入Oracle

    df.to_sql('your_table_name', connection, if_exists='append', index=False) # 关闭连接 connection.close() ``` 在这个过程中,需要注意几个关键点: - 确保Excel文件的编码与数据库字段的类型匹配,例如日期、...

    Oracle课堂笔记(很全很详细的Oracle笔记)

    - **Append**: 向当前编辑器中追加内容。 - **Run**: 执行当前编辑器中的内容。 - **Save**: 保存SQL脚本到文件。 - **Edit**: 进入编辑模式。 - **Spool**: 将查询结果导出到文件。 - **Set Pagesize**: 设置页面...

    delphi中调用oracle的存储过程.doc

    在 Delphi 中调用 Oracle 存储过程是数据库应用程序开发中的常见操作,特别是在报表解决方案中。Oracle 存储过程能够封装复杂的 SQL 语句和业务逻辑,提高代码的可维护性和执行效率。以下是如何在 Delphi 中使用 ...

Global site tag (gtag.js) - Google Analytics