• oracle 12c 内存列式存储选项(基础知识)


     

    内存列式存储(IM column store)(此特性在12cr1(12.1.0.2)版本后开始可用)是系统全局区中一个可选的部分,表中的数据是以列的形式而不是行的形式存储在内存里面的,如下图所示.在针对某列作查询的应用场景中,列式存储能极大地提升语句的执行速度.

    IM的列存储在SGA中一个新的静态池。传统的表数据是以行为单位存储,列作为行的一个个片断,列式存储是以一种新的列格式。每个列被存储为一个单独的结构。列存储区不取代缓冲区缓存,但作为一个补充,使数据可以存储在内存中的行和列格式。要使用列存储,初始化参数(inmemory_size)必须设置为非零值。

    您可以在以下任何级别启用列式存储:

    Column(列)

    Table(表)

    Materialized view(物化视图)

    Tablespace(表空间)

    Partition(分区)

    如果是在表空间级启用列存储,所有在此表空间里的表和物化视图默认情况下启用会启用列式存储。可以在列存储的所有数据库对象的列或数据库对象的列的子集上启用。类似地,对于一个分区表或物化视图,列存储都可以在某些列或列的子集上启用。

    使用列存储,可以显著提高对数据库对象上执行的以下类型操作的性能:
    1.扫描大量行的查询,并将使用诸如下列运算符的筛选器:=,< >
    2.从表或物化视图中选择一个小的列的查询,有大量的列,如从表中选择五列的查询,100列
    3.将小的表连接到大表的查询
    4.聚合类的查询

    通常情况下,创建多列索引以提高分析和报表查询的性能。但这些索引可以降低数据操作语言(DML)语句的性能。当一个数据库对象启用列存储中时,用于分析或报表查询的索引可以被减少或删除,而不会影响查询性能。删除这些索引可以提高交易和数据加载操作的性能。
    列式存储可以在以下ddl语句中使用INMEMORY 子句启用.

    • CREATE TABLE

    • ALTER TABLE

    • CREATE TABLESPACE

    • ALTER TABLESPACE

    • CREATE MATERIALIZED VIEW

    • ALTER MATERIALIZED VIEW

     通常情况下,通过 v$im_segments视图查询那些已经启用了列存储的数据库对象:

    SELECT OWNER, SEGMENT_NAME, INMEMORY_PRIORITY, INMEMORY_COMPRESSION 
       FROM V$IM_SEGMENTS;
    在列存储中,数据可以被压缩,和SQL查询执行直接对压缩的数据。
     IM Column Store压缩方法
    CREATE/ALTER Syntax                                             描述
    NO MEMCOMPRESS 不压缩
    MEMCOMPRESS FOR DML 这种方法优化DML操作和压缩列存储数据以最小比率(包括 no memCompress)。
    MEMCOMPRESS FOR QUERY LOW

    使用此选项的结果会获得最佳的查询性能。
    该方法将存储数据大于memCompress for DML的压缩比但小于memCompress for query high 选项。
    ,此选项是默认的选项当INMEMORY子句没有指定压缩方法时。

    MEMCOMPRESS FOR QUERY HIGH

    此选项将为查询提供较好的查询性能。
    此方法的压缩比率高于MEMCOMPRESS FOR QUERY LOW但小于MEMCOMPRESS FOR CAPACITY LOW选项。

    MEMCOMPRESS FOR CAPACITY LOW  

    使用此方法结果是良好的查询性能。

    MEMCOMPRESS FOR CAPACITY HIGH  该方法会导致查询结果的公平性。

    列存储数据选项
    当您启用列存储的数据库对象时,您可以让数据库对象的数据填充在列存储(默认)中,或者您可以指定一个优先级级别来确定在队列中的数据库对象的优先级。Oracle SQL包括内存优先级小节提供人口队列的更多控制。例如,它可能是更重要的或不填充数据库对象的数据填充数据的其他数据库对象的重要。

     列式存储的优先级选项

    CREATE/ALTER 语法 描述
    PRIORITY NONE


    这是默认的级别,不必在语句中显示写出。

    PRIORITY LOW

    数据被放入列式存储区的优先级高于优先级:PRIORITY NONE。
    数据被放入列式存储区的优先级低于优先级:MEDIUMHIGH, CRITICAL.。

    PRIORITY MEDIUM 数据被放入列式存储区的优先级高于优先级:NONE,PRIORITY LOW。
    数据被放入列式存储区的优先级低于优先级:HIGH, CRITICAL.。
    PRIORITY HIGH 数据被放入列式存储区的优先级高于优先级:NONE,LOW,MEDIUM。
    数据被放入列式存储区的优先级低于优先级:CRITICAL.。
    PRIORITY CRITICAL 系最高的优先级,数据将别最优先的数据放入列式存储区中.

     

    与列式存储相关的初始化参数

    Initialization Parameter                                                                                           描述
    INMEMORY_SIZE  

    此初始化参数设置数据库实例中列存储池的大小。
    默认值为0,即禁用列式存储。此初始化参数必须设置为一个非零值,以启用列式存储。如果该参数被设置为非零值,那不能小于100m。
    在一个多租户环境,在根此参数的设置是针对整个多租户数据库(CDB)设置容器。这个参数也可以设置在每个插入的数据库(PDB)限制每个PDB IM列存储的最大大小。PDB的值可以小于,等于,或大于cdb的大小。除非这个参数为某个特定的pdb设置,这意味着PDB可以使用所有可用IM列存储大小。

     


    INMEMORY_FORCE   

     

    此初始化参数可以启用列式储存对表和物化视图,或禁用列式存储的对所有表和物化视图。
    此参数设置为默认值,默认值,允许,或没有,在单独的数据库对象的属性确定是否将填充在我列存储。
    将此参数设置为关闭。

     INMEMORY_CLAUSE_DEFAULT

     此初始化参数使你为新表和物化视图指定一个默认的内存列式存储子句。

     

     INMEMORY_QUERY  这个初始化参数将定义in momory 查询是否被允许。
     INMEMORY_MAX_POPULATE_SERVERS  此参数将定义最大的后台进程个数为列式存储服务,此参数的设置应该根据系统的cpu core 来指定。
     INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT  
     OPTIMIZER_INMEMORY_AWARE  此参数将影响优化器在优化sql执行计划时是否考虑列式存储。将此参数设置为false将使优化器忽略内存列式存储。

    在数据库中启用列存储
    在表中,表空间,或物化视图启用 列存储功能之前,必须在数据库级别启用IM列存储。
    使数据库启用列存储,完成以下步骤:
    确保数据库是在12.1.0 或兼容性较高的版本。
    1.inmemory_size初始化参数设置为非零值。
    2.当你设置这个参数在服务器参数文件(二进制文件)使用ALTER SYSTEM语句,需要指定scope= SPFILE。
    3.最小设置为100m。
    4.重新启动数据库。

    例如

    alter system set inmemory_size=100M scope=spfile;
     
    System altered.
     
    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
     
    

    创建表的时候指定列式存储

    CREATE TABLE test_inmem (
         id        NUMBER(5) PRIMARY KEY,
         test_col  VARCHAR2(15))
      INMEMORY;
    

    修改表以启用列式存储

    ALTER TABLE oe.product_information INMEMORY;
    

     为表启用列式存储压缩方式

    ALTER TABLE oe.product_information INMEMORY MEMCOMPRESS FOR CAPACITY LOW;
    

    为表定义列式存储优先级

    ALTER TABLE oe.product_information INMEMORY PRIORITY HIGH;
    

    完整示例

    ALTER TABLE oe.product_information  
       INMEMORY MEMCOMPRESS FOR QUERY (
          product_id, product_name, category_id, supplier_id, min_price)
       INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (
          product_description, warranty_period, product_status, list_price)
       NO INMEMORY (
          weight_class, catalog_url);
    

    创建表空间的时候启用列式存储

    CREATE TABLESPACE tbs1 
       DATAFILE 'tbs1.dbf' SIZE 40M 
       ONLINE
       DEFAULT INMEMORY;
    

    修改表空间启用列式存储

    ALTER TABLESPACE tbs1 DEFAULT INMEMORY 
       MEMCOMPRESS FOR CAPACITY HIGH 
       PRIORITY LOW;
    

    创建物化视图时其用列式存储

    CREATE MATERIALIZED VIEW oe.prod_info_mv INMEMORY 
      AS SELECT * FROM oe.product_information;
    

    修改物化视图使用一个列式存储优先级选项

    ALTER MATERIALIZED VIEW oe.prod_info_mv INMEMORY PRIORITY HIGH;
    

      

  • 相关阅读:
    CHOCBase
    iOS 12中无法获取WiFi的SSID了?
    如何打开Assets.car文件
    博客园美化资源网站链接
    xcode工程配置绝对路径与相对路径
    UIControl事件
    UIButton属性
    UIAlertView
    UIActivityIndicatorView
    NSAttributedString
  • 原文地址:https://www.cnblogs.com/wangxingc/p/5598128.html
Copyright © 2020-2023  润新知