IM列存储参数、视图与相关操作

来源:这里教程网 时间:2026-03-03 16:27:08 作者:

一、In-Memory相关参数 1.INMEMORY_ADG_ENABLED

对于ADG,介质恢复需要在应用redo时检测in-memory中的对象,并在查询前进后使对象失效。此参数控制介质恢复是否需要进行检索并使对象失效。
此参数只在备库设置有效,在主库设置没有意义。此参数是动态参数,仅当备库未运行MRP进程时才可以修改。
如果备库是RAC,则所有备库的所有实例必须将此参数设置为相同值。
如果启动multi-instance redo apply(MIRA)恢复,则MIRA中涉及的所有实例必须将参数设置为相同的值,否则MIRA会发出错误信号。
SQL> alter system set inmemory_adg_enabled=true sid='*';

2.INMEMORY_AUTOMATIC_LEVEL

INMEMORY_AUTOMATIC_LEVEL用于启用Automatic In-Memory功能,自动管理IM列存储,以帮助确保数据集始终存储在IM列存储中。
一般在所有启用IM的段中,任何时候都仅主动查询一个子集。 该子集称为工作数据集。 对于许多应用程序,工作数据集 会随着时间而变化。
INMEMORY_AUTOMATIC_LEVEL尝试通过根据访问模式将段移入和移出IM列存储来将工作数据集保留在IM列存储中。
Oracle建议为工作数据集提供足够的内存,以适合IM列存储。
INMEMORY_AUTOMATIC_LEVEL可以设置为如下值:
  • LOW:当数据库处于内存压力时,它将从IM列存储中逐出冷段。
  • MEDIUM:当数据库处于内存压力时,它将从IM列存储中逐出冷段。 此级别包括其他优化,可确保首先填充由于内存压力而未填充的任何热段。
  • OFF(default):禁用Automatic In-Memory, 此值将IM列存储返回到Oracle Database 18c之前存在的行为。

    根据大小调整Automatic In-Memory shared pool要求的经验法则,将5 KB乘以SGA内存的INMEMORY段数。 例如,如果10,000个段具有INMEMORY属性,则为Automatic In-Memory保留50 MB的共享池。

    3.INMEMORY_CLAUSE_DEFAULT
    INMEMORY_CLAUSE_DEFAULT可以为新表和物化视图指定默认的IM列存储子句。

    如果未设置INMEMORY_CLAUSE_DEFAULT参数或将其设置为空字符串(默认值),则仅将明确指定为INMEMORY的表和物化视图填充到IM列存储中。将INMEMORY_CLAUSE_DEFAULT参数的值设置为NO INMEMORY与将其设置为默认值具有相同的效果。
    如果设置了INMEMORY_CLAUSE_DEFAULT参数,则任何指定为INMEMORY的新创建的表或实例化视图都将从该参数继承未指定的属性。默认情况下,这可以强制使用某些未在语法中明确指定的内存中选项。如果将INMEMORY_CLAUSE_DEFAULT参数设置为MEMCOMPRESS FOR CAPACITY LOW,并且将表创建为INMEMORY PRIORITY HIGH,则该表将被视为声明为INMEMORY MEMCOMPRESS FOR CAPACITY LOW PRIORITY HIGH。
    如果将INMEMORY指定为该参数的一部分,则所有新创建的表和实例化视图都将填充到IM列存储中,但明确指定为NO INMEMORY的表和实例化视图除外。例如,如果将此参数设置为INMEMORY MEMCOMPRESS FOR CAPACITY HIGH,则将创建所有新表,都将继承INMEMORY MEMCOMPRESS FOR CAPACITY HIGH。如果给定段的表空间有默认的INMEMORY值,则它将覆盖此参数的值。
    INMEMORY_CLAUSE_DEFAULT参数值的含义
  • INMEMORY:所有新创建的表和物化视图都启用INMEMORY(除非创建时指定NO INMEMORY)
  • NO INMEMORY:默认行为,新创建的表和物化视图不启用INMEMORY
  • NO MEMCOMPRESS:IM列存储不压缩
  • MEMCOMPRESS FOR DML:IM列存储针对DML操作进行了优化,并且可以执行一些轻量级的IM压缩
  • MEMCOMPRESS FOR QUERY:默认为QUERY LOW。
  • MEMCOMPRESS FOR QUERY LOW:提供了最高性能
  • MEMCOMPRESS FOR QUERY HIGH:在压缩和性能之间取得了平衡,并且权衡了性能
  • CAPACITY:默认为CAPACITY LOW
  • CAPACITY LOW:是压缩和性能之间的平衡,权衡容量
  • CAPACITY HIGH:用于最大容量
  • PRIORITY NONE:当指定PRIORITY NONE时,可以延迟IM列存储中的表填充,直到数据库确定它是有用的为止,默认值。
  • PRIORITY LOW:填充优先级>PRIORITY NONE
  • PRIORITY MEDIUM:填充优先级>PRIORITY MEDIUM>PRIORITY NONE
  • PRIORITY HIGH:填充优先级次高
  • PRIORITY CRITICAL:填充优先级最高
  • DISTRIBUTE AUTO:指定数据库将根据分区类型和重复子句的值自动决定如何在Oracle RAC实例之间分配IM列存储中的表,默认值。
  • DISTRIBUTE BY ROWID RANGE:指定将按行ID范围将IM列存储中的表分发到不同的Oracle RAC实例。
  • NO DUPLICATE:RAC实例没有副本
  • DUPLICATE:数据在另一个Oracle RAC实例上有副本,导致数据总共存在两个Oracle RAC实例上。
  • DUPLICATE ALL:数据在所有Oracle RAC实例都有副本。 如果指定DUPLICATE ALL,则数据库将强制使用DISTRIBUTE AUTO设置
    alter system set INMEMORY_CLAUSE_DEFAULT='NO INMEMORY' scope=both;
    alter system set INMEMORY_CLAUSE_DEFAULT='INMEMORY MEMCOMPRESS FOR CAPACITY HIGH' scope=both;
    alter system set INMEMORY_CLAUSE_DEFAULT='INMEMORY MEMCOMPRESS FOR QUERY LOW PRIORITY LOW' scope=both;
    alter system set INMEMORY_CLAUSE_DEFAULT='INMEMORY NO MEMCOMPRESS' scope=both;
    alter system set INMEMORY_CLAUSE_DEFAULT='INMEMORY MEMCOMPRESS FOR QUERY DISTRIBUTE AUTO DUPLICATE ALL' scope=both;
    alter system set INMEMORY_CLAUSE_DEFAULT='' scope=both;

    4.INMEMORY_EXPRESSIONS_USAGE
    INMEMORY_EXPRESSIONS_USAGE控制哪些In-Memory Expressions (IM expressions)被填充到In-Memory Column Store (IM column store)中,并且可用于查询。

    INMEMORY_EXPRESSIONS_USAGE可以设置为如下值:
  • STATIC_ONLY:启用in-memory中并包含某些数据类型(例如Oracle数字或JSON)的表将使用更有效的表示形式在IM列存储中填充这些列。 请注意,此设置将增加某些表的内存占用量。 静态配置使IM列存储可以缓存OSON(二进制JSON)列,这些列用IS_JSON检查约束标记。 在内部,OSON列是名为SYS_IME_OSON的隐藏虚拟列。 相反,动态配置会自动创建并填充常用的表达式。
  • DYNAMIC_ONLY:如果与PL / SQL存储过程DBMS_INMEMORY.IME_CAPTURE_EXPRESSIONS结合使用,则IM表达式将自动创建并填充到IM列存储中。 请注意,设置此值将增加某些表的内存占用量。 该值不应在Oracle Cloud环境中使用。
  • ENABLE:静态和动态IM表达式都将填充到IM列存储中,并且可供查询使用。 请注意,设置此值将增加某些表的内存占用量。 这是默认值。 该值不应在Oracle Cloud环境中使用。
  • DISABLE:任何类型的IM表达式都不会填充到IM列存储中。
    更改参数的模式不会立即影响现有的内存数据。 例如,如果将inmemory_expressions_usage子句从DYNAMIC_ONLY更改为DISABLE,则不会立即删除存储的IM表达式。 下次重新填充不会将表达式带回内存中,从而有效地删除了表达式。

    5.INMEMORY_FORCE
    INMEMORY_FORCE设置是否将指定为INMEMORY的表和实例化视图填充到内存中列存储(IM列存储)中。

  • DEFAULT:默认值,仅使用指定为INMEMORY的表和物化视图填充IM列存储。
  • OFF:如果指定OFF,则即使在此实例上配置了IM列存储,也不会在内存中填充任何表或物化视图。

    6.INMEMORY_MAX_POPULATE_SERVERS
    INMEMORY_MAX_POPULATE_SERVERS指定用于In-Memory列存储(IM列存储)填充的最大后台填充服务数,以便这些服务不会使系统的其余部分过载。

    仅当INMEMORY_SIZE参数也设置为正值时,此参数才有意义。
    用于此参数的值取决于系统中的内核数。 应该为in-memory后台填充分配一定百分比的CPU,并且应该相应地设置此参数。 也可以将此参数设置为0,以暂时禁止执行系统上的填充任务。
    注意:
  • 不要将该参数的值设置得太高。 如果将其设置为接近内核数或更高,则将没有CPU可供系统其余部分运行。
  • 如果此参数设置为0,则不会填充IM列存储。

    7.INMEMORY_OPTIMIZED_ARITHMETIC
    INMEMORY_OPTIMIZED_ARITHMETIC将用QUERY LOW压缩的in-memory表中的NUMBER数据类型编码为由公用指数缩放的固定宽度的本地整数。

    执行查询时,Oracle数据库NUMBER格式可能会导致相当大的性能开销,因为算术运算无法在硬件中本地执行。
    当INMEMORY_OPTIMIZED_ARITHMETIC设置为ENABLE时,对于用QUERY LOW压缩的表,将NUMBER列编码为按公用指数缩放的固定宽度的本地整数。这种in-memory优化的数字格式可以使用SIMD硬件进行快速计算。通过使用SIMD向量处理,算术运算,简单聚合和分组聚合可以显着受益。
    并非查询处理引擎中的所有行源都支持in-memory优化的数字格式。因此,IM列存储必须同时存储传统的Oracle Database NUMBER数据类型和in-memory优化的数字类型。这意味着加速分析查询性能是以增加空间开销为代价的。
    当INMEMORY_OPTIMIZED_ARITHMETIC设置为DISABLE(缺省值)时,数据库不使用优化的编码。
    如果将INMEMORY_OPTIMIZED_ARITHMETIC设置为ENABLE,然后设置为DISABLE,则不会立即删除现有IMCU的优化数字格式。相反,随着IM列存储重新填充IMCU,新的IMCU不使用优化的编码。

    8.INMEMORY_QUERY
    INMEMORY_QUERY用于在会话或系统级别启用或禁用整个数据库的in-memory查询。

    当想要使用或不使用in-memory列存储(IM列存储)来测试工作负载时,此参数很有用。
    当指定INMEMORY_SIZE参数时,默认情况下此参数启用对整个数据库的in-memory查询。

    9.INMEMORY_SIZE
    INMEMORY_SIZE设置In-Memory区域的大小,该区域包含数据库实例上的IM列存储(IM列存储)。

    默认值为0,表示不启用IM列存储。此参数的最小值为100MB
    设置此参数以启用IM列存储后,必须重新启动数据库。
    通常,此参数应至少设置为容纳将使用IM列存储的所有表所需的大小。可以将其设置得较高,以允许这些表增长或容纳将来将使用IM列存储的其他表。
    也可以为每个PDB设置此参数,以限制该PDB的IM列存储的最大大小。注意,PDB值的总和不必等于CDB值,并且PDB值的总和甚至可以大于CDB值。
    除非在PDB上专门设置了此参数,否则每个PDB都会继承CDB值,这意味着它们可以使用所有可用的IM列存储。
    为此参数指定的值计入SGA_TARGET。例如,如果将SGA_TARGET设置为10GB,而将INMEMORY_SIZE设置为2GB,则SGA_TARGET设置的20%分配给in-memory区域。
    与其他SGA组件(例如缓冲区高速缓存和共享池)不同,In-Memory Area大小不受自动内存管理的控制。 当缓冲区高速缓存或共享池需要更多内存时,数据库不会自动缩小in-memory区域;如果空间不足,数据库不会自动增大内存区域。 只能通过手动调整INMEMORY_SIZE初始化参数来增加In-Memory区域的大小。

    In-Memory Dynamic Scans需要资源管理器。 因此,当将INMEMORY_SIZE的值从0更改为非零值时,将自动启用资源管理器。 不需要特定的资源计划。

    10.INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT
    INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT限制了用于in-memory列存储(IM列存储)重新填充的后台填充服务的最大数量,因为trick流重新填充旨在仅使用一小部分填充服务。

    此参数的值是INMEMORY_MAX_POPULATE_SERVERS初始化参数值的百分比。
    如果此参数设置为5且INMEMORY_MAX_POPULATE_SERVERS设置为10,则平均一半的内核用于trick流重新填充。
    默认值为1。 在某些情况下,如果要禁用流重新填充,则可以将此参数设置为0。如果要使系统更积极地保持最新状态(以更多的后台CPU为代价),可以将参数设置为更高的值。 例如5或10。
    不允许大于50的值,以便至少一半的填充服务器可用于其他(重新)填充任务。 在某些系统上,值小于50可能是有问题的,具体取决于其他工作负载。
    仅当INMEMORY_SIZE参数也设置为正值时,此参数才有意义。

    11.INMEMORY_VIRTUAL_COLUMNS
    INMEMORY_VIRTUAL_COLUMNS控制哪些用户定义的虚拟列存储为in-memory虚拟列(IM列)。

    IM虚拟列通过避免重复计算的必要性来提高查询性能。 而且,数据库可以使用诸如SIMD矢量处理的技术来扫描和过滤IM虚拟列。
    INMEMORY_VIRTUAL_COLUMNS可以设置为如下值:
  • EANBLE:对于已启用in-memory的表或分区,所有虚拟列都将以默认表或分区inmemory压缩级别存储在内存中,除非:
  • 使用no inmemory语法将它们排除在外
  • 它们已更改为具有与基本表或分区不同的memcompress级别,在这种情况下,它们将以指定的memcompress级别存储。
  • MANUAL:这是参数的默认值。对于已启用in-memory的表或分区,除非存在以下情况,否则不会在内存中存储虚拟列:
  • 它们已被明确标记为inmemory,在这种情况下,它们将被存储在表或分区inmemory压缩级别的内存中。
  • 它们被标记为具有与基本表或分区不同的inmemory压缩级别的内存,在这种情况下,它们将以指定的inmemory压缩级别存储。
  • DISABLE:对于已启用in-memory的表或分区,将不会在inmemory中存储任何虚拟列。对于虚拟列的inmemory_column_clause的任何更改(包括memcompress级别的更改)都将被记录,但对于虚拟列的填充不起作用。

    12.OPTIMIZER_INMEMORY_AWARE
    OPTIMIZER_INMEMORY_AWARE启用或禁用inmemory所有优化程序成本模型的增强功能。

    将参数设置为false会导致优化器在优化SQL语句期间忽略表的inmemory属性。 通过将OPTIMIZER_FEATURES_ENABLE初始化参数设置为小于12.1.0.2的值,也可以实现此行为。 二、IM相关视图 1.列压缩级别

    set linesize 200 pagesize 200;
    col col_name for a60;
    select inst_id,
           owner || '.' || table_name || '.' || column_name as col_name,
           INMEMORY_COMPRESSION
      from gv$IM_COLUMN_LEVEL
     order by 1, 2;

    2.IM段(只标记为IN-MEMORY未POPULATE的不显示)

    set linesize 200 pagesize 200;
    col inst_id heading "实例";
    col obj_name heading "对象" for a30;
    col partition_name heading "分区名" for a10;
    col segment_type heading "段类型" for a8;
    col tablespace_name heading "表空间" for a10;
    col POPULATE_STATUS heading "填充状态" for a10;
    col INMEMORY_PRIORITY heading "填充优先级" for a10;
    col INMEMORY_DISTRIBUTE heading "RAC分布" for a10;
    col INMEMORY_DUPLICATE heading "RAC副本" for a15;
    col INMEMORY_COMPRESSION heading "压缩级别" for a15;
    col INMEMORY_SERVICE_NAME heading "服务名" for a10;
    SELECT inst_id,
           owner||'.'||segment_name obj_name,
           SEGMENT_TYPE,
    	   partition_name,
           tablespace_name,
           BYTES               POPU_GB,
           BYTES_NOT_POPULATED NOT_POPU_GB,
           POPULATE_STATUS,
           INMEMORY_PRIORITY,
           INMEMORY_DISTRIBUTE,
           INMEMORY_DUPLICATE,
           INMEMORY_COMPRESSION,
           INMEMORY_SERVICE,
           INMEMORY_SERVICE_NAME
      FROM gv$im_segments order by 1,3;

    3.IM内存池分配(1MB pool为实际列的填充数据,64KB pool为元数据的填充数据)

    set linesize 200 pagesize 200
    select INST_ID,
           POOL,
           ALLOC_BYTES / 1024 / 1024 ALLOC_MB,
           USED_BYTES / 1024 / 1024 USED_MB,
           POPULATE_STATUS
      from GV$INMEMORY_AREA
     ORDER BY INST_ID;

    4.IM FastStart

    set linesize 200 pagesize 200;
    col tablespace_name heading "表空间" for a20;
    col status heading "状态" for a11;
    col ALLOCATED_SIZE heading "已分配GB";
    col USED_SIZE heading "已使用GB";
    col LAST_CHECKPOINT_TIME heading "fs_ckpt_time" for a30;
    col LAST_POPULATE_TIME heading "fs_填充" for a30;
    col NUM_DEFERRED_WRITES heading "延迟写";
    select TABLESPACE_NAME,
           STATUS,
           ALLOCATED_SIZE,
           USED_SIZE,
           LAST_CHECKPOINT_TIME,
           LAST_POPULATE_TIME,
           NUM_DEFERRED_WRITES
      from V$INMEMORY_FASTSTART_AREA;

    5.启用IM的对象

    set linesize 200 pagesize 200;
    col owner for a10;
    col segment_name for a20;
    col segment_type for a10;
    SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, INMEMORY, INMEMORY_PRIORITY
      FROM DBA_SEGMENTS
     WHERE INMEMORY = 'ENABLED';

    6.启用IM的表

    set linesize 200 pagesize 200;
    col owner for a10;
    col TABLE_NAME for a20;
    SELECT OWNER, TABLE_NAME, INMEMORY
      FROM DBA_TABLES
     WHERE INMEMORY = 'ENABLED';

    7.IM内存

    SELECT NAME,VALUE/1024/1024 MB from v$SGA;

    三、相关操作 1.启用与禁用IM Column Store

    --启用
    ALTER SYSTEM SET INMEMORY_SIZE = 10G SCOPE=SPFILE;
    --禁用
    ALTER SYSTEM SET INMEMORY_SIZE =0 SCOPE=SPFILE;
    --动态增加(最少增加128MB)
    ALTER SYSTEM SET INMEMORY_SIZE = 11G;

    2.启用或禁用表IM Column Store

    --新建表启用IM
    create table test_inmem(
        id number(5) primary key,
        test_col varchar2(15)) inmemory;
    --已存在的表启用IM
    ALTER TABLE sh.sales INMEMORY;
    --已存在的表禁用IM
    ALTER TABLE sh.sales NO INMEMORY;

    3.启用表列的IM Column Store

    --所有虚拟列启用IM
    alter table hr.employees add(weekly_sal as (round(salary*12/52,2)));
    ALTER TABLE hr.employees INMEMORY;
    ALTER SYSTEM SET INMEMORY_VIRTUAL_COLUMNS=ENABLE SCOPE=SPFILE;
    --为特定虚拟列启用IM
    ALTER SYSTEM SET INMEMORY_VIRTUAL_COLUMNS=manual;
    CREATE TABLE hr.admin_emp (
          empno      NUMBER(5) PRIMARY KEY,
          ename      VARCHAR2(15) NOT NULL,
          job        VARCHAR2(10),
          sal        NUMBER(7,2),
          hrly_rate  NUMBER(7,2) GENERATED ALWAYS AS (sal/2080),
          deptno     NUMBER(3) NOT NULL) INMEMORY;
       
    ALTER TABLE hr.admin_emp INMEMORY(hrly_rate);
    --为列集启用IM
    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);

    4.启用表空间的IM Column Store

    --新创建表空间
    CREATE TABLESPACE users01 
       DATAFILE '/oracle/app/oracle/oradata/orcl/users11.dbf' SIZE 40M 
       ONLINE
       DEFAULT INMEMORY;
       
    --已存在表空间
    ALTER TABLESPACE users01 DEFAULT INMEMORY 
       MEMCOMPRESS FOR CAPACITY HIGH 
       PRIORITY LOW;

    5.启用物化视图IM Column Store

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

    6.强制IM对象填充

    EXEC DBMS_INMEMORY.POPULATE('SH', 'CUSTOMERS');

    7.捕获、填充和删除IM Expression

    EXEC DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS('CURRENT');
    EXEC DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS();
    EXEC DBMS_INMEMORY.IME_DROP_EXPRESSIONS('hr', 'employees');

    8.IM Column Store启用IM FastSart

    create tablespace fs_tbs datafile '/oracle/app/oracle/oradata/orcl/fs_tbs.dbf' size 400m reuse autoextend on;
    EXEC DBMS_INMEMORY_ADMIN.FASTSTART_ENABLE('fs_tbs');
    --将fastSart迁移到其他表空间
    EXEC DBMS_INMEMORY_ADMIN.FASTSTART_MIGRATE_STORAGE('new_fs_tbs');
    --禁用fastSart
    EXEC DBMS_INMEMORY_ADMIN.FASTSTART_DISABLE;

  • 相关推荐