zoukankan      html  css  js  c++  java
  • ORACLE EHCC(exadata hybrid columnar compression)

    目录:

      1. 简介

      2. 压缩方式及压缩比

      3. 压缩哪些数据

      4. 可能有用的脚本

     

    一、简介

      EHCC(Exadata Hybrid Columnar Compression),是Oralce 数据库在12C 中新增加的压缩方式,除了具有压缩数据的功能外,还有一个特点就是列式存储。

      也就是说,当通过EHCC方式对数据库所有数据进行压缩后,从数据存储方式上来看,可以理解成一个列式存储数据库。那么列式存储在经分系统中的高效在很多专门的列式数据库中已经体现得非常明显。这里不再拿数据说事。

      这也是Oracle 占领市场的又一尖刀。Oracle 说了,你有的,我有。你没有的,我也有,哪怕我现在没有,也很快会有!

      同时,我们可以将EHCC理解为磁盘版的 in-memory 。

      与传统的压缩方式对比,之前的压缩方式更适用于OLTP系统。而EHCC则更适合于DSS 系统,及部分OLAP系统业务。

    二、压缩方式及压缩比

      表1:压缩方式及压缩比

    压缩方式 压缩比
    BASE   65%
    FOR OLTP 62%
    Qery High 95%
    Qery Low 89%
    Archive High 97.5%
    Archive Low 95%

      2.1. 压缩比

         先说明下压缩比的概念: (1-压缩后的空间/未压缩前的空间)*100% 。 即为压缩掉的空间占原空间的比例。

         比如一张未经压缩的表的数据量为20G .那么 base 方式压缩,压缩比为65%,也就是说会压缩掉20G*65%=13G. 压缩掉13G,压缩完后,该表占用空间为7G.

         1.  BASE  与 OLTP   压缩效率差不多,而它们之间的那点差别,可能是因为BASE方式表的PCT_FREE 为0,而OLTP 为10%。
         2. QUERY LOW       相对压缩率不高,采用LZO压缩算法,但是也比ORACLE自带的压缩效果高很多
         3. QUERY HIGH和ARCHIVE LOW     都是使用ZLIB压缩算法。因此压缩几乎是相等的。
         4. ARCHIVE HIGH    采用Bzip2压缩算法实现 ,压缩比极高,

         EHCC特性支持普通的数据表和分区

      •  支持分区

          除普通堆表外,还支持对单个分区进行压缩。

            如:  

    create table test_ehcc_compression (id)
    partition by range (id)
    partition p1 values less than (100) nocompress,
    partition p2 values less than (200) compress for archive low,
    partition p3 values less than (300) compress for query high,
    partition p4 values less than (400) compress for query low);

    三、压缩哪些数据

      需要注意的一点是,对于启用了EHCC的表,并不是将插入表的所有数据都会进行EHCC的方式进行压缩。而是只有通过特定的方式插入表的数据才会处理。

    • 对于单行的insert 语句:新添加的行贿通过OLTP方式被压缩。
    • 对于update语句:修改会被转换为delete 和insert。
    • 对于delete 语句:删除只会在CU头当中对应的位上将该行标识成无效
    • alter 语句启用EHCC时,原有数据不压缩,只处理新数据。

      对于使用了EHCC的表,只有在使用以下的方式向表当中加载数据时才会触发数据压缩。

    •     直接路径insert语句
    •     并行的DML语句
    •     直接路径sqlloader
    •     CTAS(create table as select)

    四、可能有用的脚本

    1. 进行数据压缩比对比的SQL脚本

      

    -- 准备初始数据
    create table Test_objects as select * from dba_objects;
     
    begin
    for i in 1..100000 loop
       insert into Test_objects select * from dba_objects;
      commit;
     end loop;
    end;
     /
     
    -- 查看初始数据量
    select segment_name 
    ,      segment_type 
    ,      round(sum(bytes)/1024/1024/1024,2) size_gb
    from dba_segments
    where segment_name ='TEST_OBJECTS'
    group by segment_name,segment_type
    order by 1;
    
    -- 生成不同压缩方式的表
    create table test_objects_base compress nologging select/*+ parallel(a,10) */ from Test_objects a;
    create table test_objects_oltp compress for oltp nologging select/*+ parallel(a,10) */ from Test_objects a;
    create table test_objects_olap compress for olap nologging select/*+ parallel(a,10) */ from Test_objects a;
    create table test_objects_base compress for query high parallel 10 nologging select/*+ parallel(a,10) */ from Test_objects a;
    create table test_objects_base compress for query low parallel 10 nologging select/*+ parallel(a,10) */ from Test_objects a;
    create table test_objects_base compress for archive high parallel 10 nologging select/*+ parallel(a,10) */ from Test_objects a;
    create table test_objects_base compress for archive low parallel 10 nologging select/*+ parallel(a,10) */ from Test_objects a;
    
    -- 取得压缩前后各表的占用空间及各自的压缩方式
    select s.owner,segment_name,s.bytes/(1024*1024*1024) t_size,compress_for 
    from dba_segments s,dba_tables t
    where s.owner=t.owner and t.table_name=s.segment_name 
    and s.owner='&owner' and t.table_name like 'TEST_OBJECTS%';

      2. 压缩表之前预估压缩比的脚本

    declare
     v_blkcnt_cmp     pls_integer;
     v_blkcnt_uncmp   pls_integer;
     v_row_cmp        pls_integer;
     v_row_uncmp      pls_integer;
     v_cmp_ratio      number;
     v_comptype_str   varchar2(60);
    begin
     dbms_compression.get_compression_ratio(
     scratchtbsname   => upper('&ScratchTBS'),      
     ownname          => user,           
     tabname          => upper('&TableName'),   
     partname         => NULL,           
     comptype         => dbms_compression.comp_for_query_high,    
     blkcnt_cmp       => v_blkcnt_cmp,    
     blkcnt_uncmp     => v_blkcnt_uncmp,  
     row_cmp          => v_row_cmp,    
     row_uncmp        => v_row_uncmp,  
     cmp_ratio        => v_cmp_ratio,  
     comptype_str     => v_comptype_str);
     dbms_output.put_line('Estimated Compression Ratio: '||to_char(v_cmp_ratio));
     dbms_output.put_line('Blocks used by compressed sample: '||to_char(v_blkcnt_cmp));
     dbms_output.put_line('Blocks used by uncompressed sample: '||to_char(v_blkcnt_uncmp));
    end;
    /

    ===================
    天行健,君子以自强不息
    地势坤,君子以厚德载物
    ===================
  • 相关阅读:
    echo "不允许上传该类型的文件
    php构造函数,引入数据库操作类函数
    php函数描述及例子
    php如何判断远程文件是否存在
    多线程面试题系列(16):多线程十大经典案例之一 双线程读写队列数据
    多线程面试题系列(15):关键段,事件,互斥量,信号量的“遗弃”问题
    多线程面试题系列(14):读者写者问题继 读写锁SRWLock
    多线程面试体系列(13):多线程同步内功心法——PV操作下
    多线程面试题系列(12):多线程同步内功心法——PV操作上
    多线程面试题系列(11):读者写者问题
  • 原文地址:https://www.cnblogs.com/halberd-lee/p/8583210.html
Copyright © 2011-2022 走看看