• Insert 语句对 nologging 与 logging表 在不同场景下的优化


    前言

    前段时间报表数据库上有条insert sql语句,插入的大量数据,执行非常慢,需要对其进行分析优化。

    分析步骤是在:ARCHIVE与NOARCHIVE模式下进行。

    测试场景: 分别对表的常规插入表在append插入表在append + parallel插入进行性能测试,得出结果。

    环境准备

    数据库版本 基础表 nologging表 logging表
    Oracle 11g T1 T2 T3
    #创建T1,T2,T3表
    create table t1 as select * from dba_objects;
    create table t2 as select * from dba_objects where 1=2;
    create table t3 as select * from dba_objects where 1=2;
    
    #往T1表插入数据
    SQL> insert into t1 select * from t1;
    
    72813 rows created.
    
    SQL> /
    
    145626 rows created.
    
    SQL> /
    
    291252 rows created.
    
    SQL> select count(*) from t1;
    
      COUNT(*)
    ----------
        582504
    
    #设置T2表为nologging属性
    SQL> alter table t2 nologging;
    
    Table altered.

    数据库处于ARCHIVE时

    常规插入

    nologging 表T2

    SQL> insert into t2 select * from t1; 
    commit;
    582824 rows created.
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3617692013
    
    ---------------------------------------------------------------------------------
    | Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time |
    ---------------------------------------------------------------------------------
    |   0 | INSERT STATEMENT     |  |   582K|    53M|  1455   (2)| 00:00:18 |
    |   1 |  LOAD TABLE CONVENTIONAL | T2   |   |   |        |      |
    |   2 |   TABLE ACCESS FULL  | T1   |   582K|    53M|  1455   (2)| 00:00:18 |
    ---------------------------------------------------------------------------------
    
    
    Statistics
    ----------------------------------------------------------
           3345  recursive calls
          46879  db block gets
          27878  consistent gets
           8269  physical reads
       67752144  redo size
        838  bytes sent via SQL*Net to client
        784  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          3  sorts (memory)
          0  sorts (disk)
         582824  rows processed
    
    SQL> 
    Commit complete. 

    耗费:67752144 redo size

    logging 表T3

    SQL> insert into t3 select * from t1; 
    commit;
    582824 rows created.
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3617692013
    
    ---------------------------------------------------------------------------------
    | Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time |
    ---------------------------------------------------------------------------------
    |   0 | INSERT STATEMENT     |  |   582K|    53M|  1455   (2)| 00:00:18 |
    |   1 |  LOAD TABLE CONVENTIONAL | T3   |   |   |        |      |
    |   2 |   TABLE ACCESS FULL  | T1   |   582K|    53M|  1455   (2)| 00:00:18 |
    ---------------------------------------------------------------------------------
    
    
    Statistics
    ----------------------------------------------------------
           2860  recursive calls
          46875  db block gets
          27811  consistent gets
          1  physical reads
       67875992  redo size
        829  bytes sent via SQL*Net to client
        784  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed
    
    SQL> 
    Commit complete.

    耗费:67875992 redo size

    append 插入

    nologging 表T2

    SQL> insert /*+ append */  into t2 select * from t1; 
    commit;
    582824 rows created.
    
    
    Execution Plan
    ----------------------------------------------------------
    
    ERROR:
    ORA-12838: cannot read/modify an object after modifying it in parallel
    
    
    SP2-0612: Error generating AUTOTRACE EXPLAIN report
    
    Statistics
    ----------------------------------------------------------
           2627  recursive calls
           9324  db block gets
           8832  consistent gets
          0  physical reads
         143436  redo size
        824  bytes sent via SQL*Net to client
        798  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:143436 redo size

    logging 表T3

    SQL> insert /*+ append */ into t3 select * from t1; 
    
    582824 rows created.
    
    
    Execution Plan
    ----------------------------------------------------------
    ERROR:
    ORA-12838: cannot read/modify an object after modifying it in parallel
    
    
    SP2-0612: Error generating AUTOTRACE EXPLAIN report
    
    Statistics
    ----------------------------------------------------------
           2627  recursive calls
           9327  db block gets
           8832  consistent gets
          0  physical reads
       68384900  redo size
        822  bytes sent via SQL*Net to client
        797  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:68384900 redo size

    parallel + append 插入

    nologging 表T2

    SQL> alter session enable parallel dml;
    insert /*+ append parallel(2) */ into t2 select * from t1; 
    commit;
    Session altered.
    
    SQL> 
    
    582824 rows created.
    
    
    Execution Plan
    ----------------------------------------------------------
    ERROR:
    ORA-12838: cannot read/modify an object after modifying it in parallel
    
    
    SP2-0612: Error generating AUTOTRACE EXPLAIN report
    
    Statistics
    ----------------------------------------------------------
         52  recursive calls
         32  db block gets
         19  consistent gets
          0  physical reads
          21916  redo size
        824  bytes sent via SQL*Net to client
        809  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:21916 redo size

    logging 表T3

    SQL> alter session enable parallel dml;
    insert /*+ append parallel(2)*/ into t3 select * from t1; 
    commit;
    Session altered.
    
    SQL> 
    
    582824 rows created.
    
    
    Execution Plan
    ----------------------------------------------------------
    ERROR:
    ORA-12838: cannot read/modify an object after modifying it in parallel
    
    
    SP2-0612: Error generating AUTOTRACE EXPLAIN report
    
    Statistics
    ----------------------------------------------------------
         50  recursive calls
         33  db block gets
         20  consistent gets
          0  physical reads
          21308  redo size
        824  bytes sent via SQL*Net to client
        808  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:21308 redo size

    数据库处于NOARCHIVE时

    常规插入

    nologging 表T2

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3617692013
    
    ---------------------------------------------------------------------------------
    | Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time |
    ---------------------------------------------------------------------------------
    |   0 | INSERT STATEMENT     |  |   582K|    53M|  1455   (2)| 00:00:18 |
    |   1 |  LOAD TABLE CONVENTIONAL | T2   |   |   |        |      |
    |   2 |   TABLE ACCESS FULL  | T1   |   582K|    53M|  1455   (2)| 00:00:18 |
    ---------------------------------------------------------------------------------
    
    
    Statistics
    ----------------------------------------------------------
           2538  recursive calls
          46869  db block gets
          27796  consistent gets
           8266  physical reads
       67754744  redo size
        824  bytes sent via SQL*Net to client
        784  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:67754744 redo size

    logging 表T3

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3617692013
    
    ---------------------------------------------------------------------------------
    | Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time |
    ---------------------------------------------------------------------------------
    |   0 | INSERT STATEMENT     |  |   582K|    53M|  1455   (2)| 00:00:18 |
    |   1 |  LOAD TABLE CONVENTIONAL | T3   |   |   |        |      |
    |   2 |   TABLE ACCESS FULL  | T1   |   582K|    53M|  1455   (2)| 00:00:18 |
    ---------------------------------------------------------------------------------
    
    
    Statistics
    ----------------------------------------------------------
           2593  recursive calls
          46873  db block gets
          27800  consistent gets
           1600  physical reads
       67757328  redo size
        824  bytes sent via SQL*Net to client
        784  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          3  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:67757328 redo size

    append 插入

    nologging 表T2

    Statistics
    ----------------------------------------------------------
           2627  recursive calls
           9324  db block gets
           8832  consistent gets
           2993  physical reads
         143480  redo size
        822  bytes sent via SQL*Net to client
        798  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:143480 redo size

    logging 表T3

    Statistics
    ----------------------------------------------------------
           2627  recursive calls
           9327  db block gets
           8832  consistent gets
          0  physical reads
         143420  redo size
        821  bytes sent via SQL*Net to client
        798  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:143420 redo size

    parallel + append 插入

    nologging 表T2

    Statistics
    ----------------------------------------------------------
         50  recursive calls
         32  db block gets
         21  consistent gets
          0  physical reads
          21896  redo size
        823  bytes sent via SQL*Net to client
        810  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:21896 redo size

    logging 表T3

    Statistics
    ----------------------------------------------------------
         50  recursive calls
         33  db block gets
         20  consistent gets
          0  physical reads
          21896  redo size
        821  bytes sent via SQL*Net to client
        809  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         582824  rows processed

    耗费:21896 redo size

    综合比较

    属性 表名 常规插入产生的redo size apppend插入产生的redo size apppend + parallel插入产生的redo size
    数据库模式 archive
    nologing t2 67752144 143436 21916
    loging t3 67875992 68384900 21308
    数据库模式 noarchive
    nologing t2 67754744 143480 21896
    loging t3 67757328 143420 21896

    1)数据库处于ARCHIVE模式时,对logging表执行append插入,是对性能没有优化的加并行parallel才会有影响。
    2)数据库处于NOARCHIVE模式时,对logging表执行append插入,可以有效的提升性能。当然加并行parallel效果会更好

  • 相关阅读:
    极简风格的LOGO,收集一波!
    如何利用AI软件中的混合器工具制作文字
    国内有哪些非常有设计感的 App?
    如何用PS制作花型背景图
    怎样去调整摄影作品的背景颜色
    如何用PS把数码拍摄的荷花照片制作成中国风的效果
    PS 抠人像如何抠得干净?
    如何用 Ps 制作毛玻璃穿透效果?
    化装品经过这样PS包装,身价立马翻10倍
    有哪些漂亮的中国风 LOGO 设计?
  • 原文地址:https://www.cnblogs.com/wanbin/p/9514681.html
Copyright © 2020-2023  润新知