`

(direct-path insert)研究

SQL 
阅读更多

直接路径插入使用直接写(direct write)操作,在要修改的段的高水位(high watermark)以上直接加载数据,这个事实产生以下重要的结果:

1. 由于直接写的缘故,高速缓存被辟开了.

2. 不允许在被修改的表上同步的执行DELETE,INSERT,MERGE,UPDATE语句,以及索引的创建(重建)操作.

3.在高水位以下的包含空闲空间的块也不会被利用.

直接路径插入之所以可以获得更好的性能,其中一个原因是,只为这个段生成了最少量的回滚.实际上,只为空间管理操作做了回滚.

 

有以下两种方式可以使一个INSERT INTO...SELECT...语句使用直接路径插入.

1.在SQL语句中指定append提示:INSERT /*+ append*/ INTO...SELECT...

2.并行地执行SQL语句.注意,在这里,插入(INSERT)与查询(SELECT)都可以独立地被并行处理.要利用直接路径插入,至少INSERT部分必须被并行执行.

测试如下:

1.以常规方式插入数据(noarchivelog mode,logging mode, no direct-path insert)

LIBIN@dextrys>DROP TABLE t;
DROP TABLE t
           *
第 1 行出现错误:
ORA-00942: 表或视图不存在


已用时间:  00: 00: 00.15
LIBIN@dextrys>
LIBIN@dextrys>CREATE TABLE t (id NUMBER, pad VARCHAR2(1000));

表已创建。

已用时间:  00: 00: 00.06

为表添加主键约束:
LIBIN@dextrys>ALTER TABLE t ADD CONSTRAINT t_pk PRIMARY KEY (id);

表已更改。

已用时间:  00: 00: 00.21
LIBIN@dextrys>TRUNCATE TABLE t;

表被截断。

已用时间:  00: 00: 00.12
LIBIN@dextrys>SELECT value
  2  FROM v$mystat NATURAL JOIN v$statname
  3  WHERE name = 'redo size';
     VALUE
----------
     29332

已用时间:  00: 00: 00.07
LIBIN@dextrys>ALTER TABLE t LOGGING;

表已更改。

已用时间:  00: 00: 00.01
LIBIN@dextrys>INSERT INTO t
  2  SELECT rownum AS id, rpad('*',1000,'*') AS pad
  3  FROM dual
  4  CONNECT BY level <= 1000000;

已创建1000000行。

已用时间:  00: 03: 11.98

检查生成的已用回滚信息.
LIBIN@dextrys>SELECT t.used_ublk, t.used_urec
  2  FROM v$transaction t, v$session s
  3  WHERE t.addr = s.taddr
  4  AND s.audsid = userenv('sessionid');
 USED_UBLK  USED_UREC
---------- ----------
      4320     378280

已用时间:  00: 00: 00.12
LIBIN@dextrys>SELECT value
  2  FROM v$mystat NATURAL JOIN v$statname
  3  WHERE name = 'redo size';
     VALUE
----------
1192914920

已用时间:  00: 00: 00.03

说明:常规方式下,插入100万条数据,花费大约192秒,生成大量回滚信息,生成(1192914920-29332)字节redo log;

2.以(direct-path insert)方式插入数据(noarchivelog mode,logging mode,  direct-path insert)
LIBIN@dextrys>TRUNCATE TABLE t;

表被截断。

已用时间:  00: 00: 01.43
LIBIN@dextrys>ALTER TABLE t LOGGING;

表已更改。

已用时间:  00: 00: 00.07
LIBIN@dextrys>INSERT /*+ append */ INTO t
  2  SELECT rownum AS id, rpad('*',1000,'*') AS pad
  3  FROM dual
  4  CONNECT BY level <= 1000000;

已创建1000000行。

已用时间:  00: 00: 37.04
LIBIN@dextrys>SELECT t.used_ublk, t.used_urec
  2  FROM v$transaction t, v$session s
  3  WHERE t.addr = s.taddr
  4  AND s.audsid = userenv('sessionid');
 USED_UBLK  USED_UREC
---------- ----------
      1070       7490

已用时间:  00: 00: 00.03
LIBIN@dextrys>SELECT value
  2  FROM v$mystat NATURAL JOIN v$statname
  3  WHERE name = 'redo size';
     VALUE
----------
1251788232

已用时间:  00: 00: 00.01

说明:(direct-path insert)方式下,插入100万条数据,花费大约37秒,生成少量回滚信息(回滚信息是为维护索引而产生的),生成(1251788232-1192914920)字节redo log;

3.以(direct-path insert)方式插入数据(noarchivelog mode,nologging mode,  direct-path insert)
LIBIN@dextrys>TRUNCATE TABLE t;

表被截断。

已用时间:  00: 00: 02.82
LIBIN@dextrys>ALTER TABLE t NOLOGGING;

表已更改。

已用时间:  00: 00: 00.03
LIBIN@dextrys>INSERT /*+ append */ INTO t
  2  SELECT rownum AS id, rpad('*',1000,'*') AS pad
  3  FROM dual
  4  CONNECT BY level <= 1000000;

已创建1000000行。

已用时间:  00: 00: 36.18
LIBIN@dextrys>SELECT t.used_ublk, t.used_urec
  2  FROM v$transaction t, v$session s
  3  WHERE t.addr = s.taddr
  4  AND s.audsid = userenv('sessionid');
 USED_UBLK  USED_UREC
---------- ----------
      1071       7496

已用时间:  00: 00: 00.03
LIBIN@dextrys>SELECT value
  2  FROM v$mystat NATURAL JOIN v$statname
  3  WHERE name = 'redo size';
     VALUE
----------
1311002048

已用时间:  00: 00: 00.01

说明:(direct-path insert)方式下,插入100万条数据,花费大约36秒,生成少量回滚信息(回滚信息是为维护索引而产生的),生成(1311002048-1251788232)字节redo log;

2和3的比较说明了:即使没有使用最小日志模式,在非归档(noarchivelog)模式下运行的数据库也不会为直接路径插入操作生成重做日志.

 

 

4.以(direct-path insert)方式插入数据(noarchivelog mode,nologging mode,  direct-path insert),且删除表上的索引

 

 

LIBIN@dextrys>TRUNCATE TABLE t;

表被截断。

已用时间:  00: 00: 03.07
LIBIN@dextrys>alter table t drop constraint t_pk ;

表已更改。

已用时间:  00: 00: 00.48
LIBIN@dextrys>SELECT value
  2  FROM v$mystat NATURAL JOIN v$statname
  3  WHERE name = 'redo size';
     VALUE
----------
1311588524

已用时间:  00: 00: 00.07
LIBIN@dextrys>ALTER TABLE t NOLOGGING;

表已更改。

已用时间:  00: 00: 00.01
LIBIN@dextrys>INSERT /*+ append */ INTO t
  2  SELECT rownum AS id, rpad('*',1000,'*') AS pad
  3  FROM dual
  4  CONNECT BY level <= 1000000;

已创建1000000行。

已用时间:  00: 00: 25.68
LIBIN@dextrys>SELECT t.used_ublk, t.used_urec
  2  FROM v$transaction t, v$session s
  3  WHERE t.addr = s.taddr
  4  AND s.audsid = userenv('sessionid');
 USED_UBLK  USED_UREC
---------- ----------
         1          1

已用时间:  00: 00: 00.03
LIBIN@dextrys>SELECT value
  2  FROM v$mystat NATURAL JOIN v$statname
  3  WHERE name = 'redo size';
     VALUE
----------
1312384532

已用时间:  00: 00: 00.01

说明:删除表上的索引以后,(direct-path insert)方式下,插入100万条数据,花费大约26秒,生成少量回滚信息为1,生成(1312384532-1311002048)字节redo log;以上说明了若表上有索引,在执行DML时,索引段上会生成回滚信息,如果要加快操作速度,避免生成索引相关的回滚,可以在加载数据之前将索引改为不可用,并在加载之后来重建这些索引.

 

在执行直接路径插入的过程中,高水位不会被提高.只有到提交事务的时候才会执行这个操作.因此,在加载之后提交(或回滚)事务之前,执行直接路径插入的会话无法访问被修改的表.在提交(或回滚)之前执行的SQL语句会终止执行,并报一个"ORA-12838"错误.

LIBIN@dextrys>select count(*) from t;
select count(*) from t
                     *
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象


已用时间:  00: 00: 00.06
LIBIN@dextrys>commit;

提交完成。

已用时间:  00: 00: 00.06
LIBIN@dextrys>select count(*) from t;
  COUNT(*)
----------
   1000000

已用时间:  00: 00: 22.09

分享到:
评论

相关推荐

    Oracle 大数据量操作优化.pdf

    同时,Direct-Path插入只适用于INSERT INTO...SELECT语句,不适用于单行插入。 8. **Nologging选项**:在归档模式下,配合`NLOGGING`属性使用Direct-Path插入,可以显著减少重做日志的生成,进一步提高性能。但在非...

    Oracle 大数据量操作优化

    - Direct-Path插入是一种特殊的数据加载机制,它可以极大地提高插入性能。 - 特点包括: - 只适用于`INSERT...SELECT`语句。 - 不记录重做日志,有助于减少恢复时的工作量。 - 直接在表段的高水位线以上写入...

    oracle文本导入导出工具-ozoradts

    rows = Number of rows in conventional path bind array or between direct path data saves nolog = no logging方式导入 (默认FALSE) Export Valid Keywords: query = select语句,只支持单表查询 table = ...

    unigui0.83.5.820

    - 0000507: Direct filename or image URL for TUniImage - 0000733: TUniScreenMask with a TUniPageControl does not work - 0000734: AutoScroll property for UniHTMLFrame - 0000680: The Alignment ...

    Oracle 10g 学习笔记

    │ Oracle Direct-Path Insert学习笔记 - NyThing的Java日记 - JavaEye技术网站.mht │ oracle 常用傻瓜1000问 - oracle10g - 小呵呵.mht │ oracle 常用傻瓜1000问 - oracle10g - 小呵呵.mht.lnk │ ORACLE 面试...

    plsql批量导入数据

    使用该包前,确保已启用“direct path insert”权限,然后调用如下: ```plsql BEGIN DBMS_BULK_INSERT(target_table =&gt; 'YOUR_TABLE', file_name =&gt; 'path_to_your_data_file.csv', badfile =&gt; 'path_to_your_...

    词霸天下1456词根全集2

    23. -path(o)- = -pat(i)- = -pass(i)- = -pathy-:感受、受苦的;例如:pathetic(感人的)、sympathy(同情) 24. -strain- = -strict- = -stress- = -string- = -strang-:拉紧;例如:strain(拉紧)、stress...

    /* append*/ oracle append 知识点

    这种插入方式被称为 **Append Mode** 或 **Direct Path Insert**。它能显著提高大数据量插入的效率,尤其是在归档模式与非归档模式下对日志和undo数据的影响。 #### 二、Append Mode 插入特点 ##### 1. 日志记录...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    Now it is possible to define is the drawing take place via WMPaint or via the PaintTo direct call (if rcPaint contain non-empty rectangle then WMPaint in progress). - FIX: The TFlexPanel.FPaintCache ...

    Exadata在1号店数据平台的应用实践

    Exadata的OLAP系统中的EHCC(Hybrid Columnar Compression)是一种混合柱状压缩技术,它能够提高数据的存储效率,尤其在Direct Path Load以及在支持DIRECT选项的Impdp或Direct Path Insert操作中。然而,使用HCC时...

    oracle java驱动包

    - 使用Oracle特定的JDBC特性,如Direct Path Insert,批量操作等。 7. **错误处理和诊断**: Oracle JDBC驱动提供了详细的异常处理机制,可以帮助开发者快速定位和解决问题。通过日志记录和监控工具,可以对...

    1z0-055 Oracle11g NewFeatures 4 9i OCPs _ppt

    6. **Direct Path Insert**:优化了大量数据插入性能,通过跳过缓冲区高速缓存直接写入数据文件,显著提升了大数据量导入的速度。 7. ** flashback技术**:包括Flashback Query、Flashback Table和Flashback ...

    Oracle 数据库备份与恢复总结.pdf

    - **Conventional Path Load与Direct Path Load**: Direct Path Load速度更快但不支持所有数据类型和选项。 - **SPOOL导出文本数据方法**: 可用于导出查询结果到文件中。 **2.3 脚本** - **将表中数据记录导出为...

    RxLib控件包内含RxGIF,全部源码及DEMO

    TDateEdit and TDBDateEdit (data-aware version) allows direct typing and has a button to bring up calendar in popup window (combo-box alike) or in a dialog. TQBEQuery enables Delphi applications to ...

    对比Oracle数据库中多种导入数据方法

    7. Direct Path Insert:Oracle的一种内部机制,直接将数据写入数据文件,跳过缓存和redo日志,速度极快。但这种方法会清空表,且不触发触发器、约束和索引,适用于初始化或全量替换数据的场景。 影响数据导入速度...

    Oracle 导入错误IMP-00010:不是有效的导出文件,头部验证失败

    5. **导出参数**:检查`expdp`命令中是否指定了正确的参数,特别是`DIRECT_PATH_NO_LOG`和`FULL`选项。如果在导出时使用了这些选项,可能需要在导入时也使用相应的参数。 6. **权限问题**:确认执行导入操作的用户...

    Oracle Lob Performance Guidelines

    8. **使用 Direct Path 插入**:在插入大量 LOB 数据时,使用 Direct Path 插入可以显著提高性能。这可以通过 SQL*Loader 或 `INSERT /*+ APPEND */` 语句实现。 9. **优化查询计划**:确保数据库优化器选择最优的...

    超好用的ORACLE备份/导入数据库脚本

    高效的导入脚本会考虑如何最大限度地利用系统资源,比如调整并行度、启用Direct Path Insert等。 “超好用”的脚本可能包含了自动化和定制化功能,例如自动定时执行、根据环境变量动态配置备份路径、邮件通知结果等...

Global site tag (gtag.js) - Google Analytics