ITPub博客

首页 > 数据库 > Oracle > IM列存储参数、视图与相关操作

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

原创 Oracle 作者:q499311546 时间:2021-02-09 16:48:46 0 删除 编辑

一、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;


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31355629/viewspace-2757000/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-06-03

  • 博文量
    38
  • 访问量
    53166