zoukankan      html  css  js  c++  java
  • Oracle快速插入数据append

    1:用merge into 进行匹配更新和插入,
    2: 开启并行,提高速度
    3: 如果可以的话加NOLOGING 不写入日志
    4:如果数据有规律的话,分批次执行

    1.使用marge快速插入;

    MERGE /*+ append */
       INTO A d
    USING (select * B where ...) f
        ON (d.account_no = f.account_no)
    WHEN MATCHED THEN
        update set acc_date = f.acc_date,...
    WHEN NOT MATCHED THEN
        insert values ( f.account_no,f.acc_date..)
    /
    commit;


    2.向表中插入两条记录

    SQL> INSERT ALL
      2     INTO toms values(1)
      3     into toms values(2)
      4     select * from dual;

    已创建2行。

    SQL> commit;


    3.在插入时不记录日志记录的快速方法
    INSERT的时候可通过APPEND选项不产生归档日志。

    alter table aa nologging

    alter table aa logging

    insert /*+append*/ into ...nologing
    select * from ...

    insert /*+ append, parallel */ into ods_list_t nologging
    select * from ods_list;

    但这样不行:整个表可以插入,但要某一个字段则不能加入nologging
    insert /*+ append, parallel */ into ods_list_t(a,b) nologging
    select a,b from ods_list;

    但可以这样:
    insert /*+ append, parallel */ into ods_list_t  nologging(a,b)
    select a,b from ods_list;

    create table ods_list_t nologging as select * from ods_list;

    insert /*+ append, parallel */ into ods_list_t nologging
    select * from ods_list;


    insert /*+ Append parallel(tablename,number) */ into ods_list_t nologging
    select * from ods_list;

    tablename: 表名
    number: 并行度

    4、
    使用批量拷贝方法
    set arraysize 20
    set copycommit 5000
    copy from username/password@oracle_name append table_name1
    using select * from table_name2;

    --------------------------------------------------
    一、非归档模式下:
    没有优化前    (1281372  redo size)
    1、单一的使用nologging参数,对redo的产生没有什么影响。  (1214836  redo size)
    2、单一的使用append提示,redo的减少很显著              (43872  redo size)
    3、nologging+append,更显著                             (1108  redo size)

    二、归档模式下:
    没有优化前:           
    1、单独使用nologging参数,(1231904  redo size)
    2、单独使用append提示,  (1245804  redo size)
    3、nologging + append,     (3748  redo size)

    a、使用nologging参数并不代表在dml操作中,oracle不产生redo,只是对于指定表的更新数据不产生redo,但是oracle还是要记录这些操作,所以无论怎么优化,dml操作肯定要产生redo,但是使用这些参数对redo size的影响还是非常可观的。
    b、单独使用nologging参数,对redo size没有多少影响,只有和append配合时,才能产生效果。
    c、单独使用append提示,对redo的产生影响很大,这是我到现在都不明白的道理,按说append是绕过freelists,直接去寻找新块,能减少对freelists的争用,为什么会少这么多redo呢?
    d、归档模式和非归档模式下,参数影响不一样,尤其是单独使用append参数时,看来oracle对归档模式下出于安全考虑还是要多一些。
    ---------------------------------------------------------------------------------

    oracle append有什么作用?

    请教一下,oracle中append是做什么用的。
      insert /*+append*/ into table1 select * from table2
    在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。
    使用append会增加数据插入的速度。
    /*+APPEND*/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间
    append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo
    不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。

    1. 采用高速的存储设备,提高读写能力,如:EMC 和NetApp,

    2. 假如tab1表中的没有数据的话
    DROP   TABLE   TAB1;
    CREATE   TABLE   TAB1   AS   SELECT   *   FROM   TAB2;
    然后在创建索引

    3. 用Hint 提示减少操作时间

        INSERT   /*+Append*/   INTO     tab1
                    SELECT   *   FROM   tab2;

    4. 采用不写日志及使用Hint提示减少数据操作的时间。

    建议方案是先修改表为不写日志:
    sql> alter   table   table_name   NOLOGGING;

    插入数据:

    INSERT   /*+Append*/   INTO     tab1
          SELECT   *   FROM   tab2;

    插入完数据后,再修改表写日志:
    sql> alter   table   table_name   LOGGING;

    这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。

    5. 用EXP/IMP 处理大量数据

    (1)给当前的两个表分别改名
    alter   table   tab1   rename   to   tab11;
    alter   table   tab2   rename   to   tab1;
    (2)导出改名前的tab2
    exp   user/pwd@...   file=...   log=...   tables=(tab1)
    (3)把名字改回来
    alter   table   tab1   rename   to   tab2;
    alter   table   tab11   rename   to   tab1;
    (4)导入数据
    imp   user/pwd@...   file=...   log=...   fromuser=user   touser=user   tables=(tab1)

  • 相关阅读:
    AI 最小二乘法
    AI 前馈神经网络
    AI 雅可比(Jacobian)矩阵
    AI 递归神经网络(RNN)
    AI 循环神经网络(RNN)
    js操作地址栏
    JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
    php实现的三个常用加密解密功能函数示例
    php 获取URL 各部分参数
    PHP实现队列及队列原理
  • 原文地址:https://www.cnblogs.com/bigbean/p/3685378.html
Copyright © 2011-2022 走看看