Database In-Memory 是 Enterprise Edition 的一个选项,现在具有新的“基本级别”功能。 这允许使用具有高达 16GB 列存储的 Database In-Memory,而无需许可该选项。 使用基本级别功能不会触发任何许可证跟踪。
使用基本级别功能时,IM 列存储限制为 16GB。 这可以让客户看到 Database In-Memory 的价值,而不必担心许可问题。 请注意,基础级别还有一些其他限制; 例如,基本级别不包含 CellMemory 功能和 Automatic In-Memory。
自动In-Memroy 特性介绍
Automatic In-Memory (AIM) 无需用户干预即可启用、填充、逐出和重新压缩段。
当 INMEMORY_AUTOMATIC_LEVEL 设置为 HIGH 时,数据库会根据它们的使用模式自动填充段,而不需要将它们标记为 INMEMORY。 结合对选择性列级重新压缩的支持,内存中的填充在很大程度上是自我管理的。 这种自动化有助于最大限度地提高一次可以填充到内存列存储(IM 列存储)中的对象数量,并最大限度地提高整体应用程序性能。
本页提供有关 INMEMORY_AUTOMATIC_LEVEL 初始化参数的新值如何影响 In-Memory Column Store 中的内存段压缩行为、填充到 In-Memory Column Store 以及从 In-Memory Column 逐出的更多详细信息。
Automatic In-Memory 在 SQL 工作负载发生变化时对其进行优化,无需人工干预。
工作数据集由最常查询的段组成。通常,许多应用程序的工作数据集会随时间而变化。用户必须决定将哪些段启用为 INMEMORY,监控使用情况以决定填充和驱逐哪些 IM 段,并创建 ADO IM 策略。这些任务需要对工作负载有透彻的了解。
为了将 DBA 从手动维护工作中解放出来,Automatic In-Memory 使用经常更新的内部统计信息来维护 IM 列存储中的工作数据集。 Oracle 数据库决定填充什么、驱逐什么以及何时执行。从某种意义上说,IM栏目店变成了“自动驾驶”。
当 INMEMORY_AUTOMATIC_LEVEL 初始化参数设置为 HIGH 时,Automatic In-Memory 会持续监控 IM 存储中的列统计信息,并将所有没有预先存在的 INMEMORY 属性的段设置为 INMEMORY MEMCOMPRESS AUTO。数据库仅填充它认为属于工作数据集中的对象。该决定基于当前使用情况统计。数据库通过内部列统计识别 IM 存储的冷区,这与 Heat Map 使用的类似,但不需要将 HEAT_MAP 设置为 ON。 Automatic In-Memory 可以重新压缩 AUTO 段中的冷列以节省空间。优先级设置不是 NONE 的段被排除在自动驱逐算法之外。
实践:配置和观察自动内存
概述 此实践展示了如何配置 Automatic In-Memory,然后观察内存中的对象如何在没有用户干预的情况下自动动态地填充到 IM 列存储中,然后可能会自动从 IM 列存储中逐出。
在开始任何新的实践之前,请参阅实践环境建议。
第 1 步:使用 In-Memory Column Store 设置环境 shell脚本将IM列存储配置为110M,在PDB21的HR schema中创建NO INMEMORY表,最后在HR表中插入行。
$ /home/oracle/labs/M104783GC10/AutoIM_setup.sh
...
SQL> ALTER SYSTEM SET sga_target=812M SCOPE=spfile;
System altered.
SQL> ALTER SYSTEM SET inmemory_size=110M SCOPE=SPFILE;
System altered.
SQL> ALTER SYSTEM SET query_rewrite_integrity=stale_tolerated SCOPE=SPFILE;
System altered.
SQL> SET ECHO OFF
System altered.
SQL> ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL=LOW SCOPE=SPFILE;
System altered.
...
SQL> CREATE TABLESPACE imtbs DATAFILE SIZE 10G;
Tablespace created.
SQL> EXIT
...
SQL> CREATE TABLE hr.emp INMEMORY AS SELECT * FROM hr.employees ;
Table created.
SQL> INSERT INTO hr.emp SELECT * FROM hr.emp;
107 rows created.
...
SQL> /
1753088 rows created.
SQL> COMMIT;
Commit complete.
SQL> EXIT
步骤 2:配置内存表 查询数据字典以确定 HR 表是否指定为 INMEMORY。
Enter password:
Connected to:
SQL> COL table_name FORMAT A18
SQL> SELECT table_name, inmemory, inmemory_compression
FROM dba_tables WHERE owner='HR';
TABLE_NAME INMEMORY INMEMORY_COMPRESS
------------------ -------- -----------------
REGIONS DISABLED
LOCATIONS DISABLED
DEPARTMENTS DISABLED
JOBS DISABLED
EMPLOYEES DISABLED
JOB_HISTORY DISABLED
EMP ENABLED FOR QUERY LOW
COUNTRIES DISABLED
8 rows selected.
将 INMEMORY 和 MEMCOMPRESS FOR CAPACITY LOW 属性应用于 HR.JOB_HISTORY 表。
Table altered.
SQL> SELECT table_name, inmemory, inmemory_compression
FROM dba_tables WHERE owner='HR';
TABLE_NAME INMEMORY INMEMORY_COMPRESS
------------------ -------- -----------------
REGIONS DISABLED
LOCATIONS DISABLED
DEPARTMENTS DISABLED
JOBS DISABLED
EMPLOYEES DISABLED
JOB_HISTORY ENABLED FOR CAPACITY LOW
EMP ENABLED FOR QUERY LOW
COUNTRIES DISABLED
8 rows selected.
第 3 步:配置自动内存 连接到 CDB 根,然后将 INMEMORY_AUTOMATIC_LEVEL 设置为 HIGH,然后重新启动数据库实例。
Connected.
SQL> ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL=HIGH SCOPE=SPFILE;
System altered.
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP
ORACLE instance started.
Total System Global Area 851442944 bytes
Fixed Size 9571584 bytes
Variable Size 440401920 bytes
Database Buffers 276824064 bytes
Redo Buffers 7204864 bytes
In-Memory Area 117440512 bytes
Database mounted.
Database opened.
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
Pluggable database altered.
查询数据字典以确定 HR 表是否指定为 INMEMORY。
Enter password:
Connected.
SQL> SELECT table_name, inmemory, inmemory_compression
FROM dba_tables WHERE owner='HR';
TABLE_NAME INMEMORY INMEMORY_COMPRESS
------------------ -------- -----------------
REGIONS DISABLED
LOCATIONS DISABLED
DEPARTMENTS DISABLED
JOBS DISABLED
EMPLOYEES DISABLED
JOB_HISTORY ENABLED FOR CAPACITY LOW
EMP ENABLED FOR QUERY LOW
COUNTRIES DISABLED
8 rows selected.
为什么 HR 表没有启用 INMEMORY,除了那些已经手动设置为 INMEMORY 的表? 在 PDB 中显示 INMEMORY_AUTOMATIC_LEVEL。
NAME TYPE VALUE
------------------------------------ ----------- -------------
inmemory_automatic_level string LOW
SQL> SELECT ispdb_modifiable FROM v$parameter WHERE name='inmemory_automatic_level';
ISPDB
-----
TRUE
在 PDB 级别将 INMEMORY_AUTOMATIC_LEVEL 设置为 HIGH,然后重新启动 PDB21。
System altered.
SQL> SHUTDOWN IMMEDIATE
Pluggable Database closed.
SQL> STARTUP
Pluggable Database opened.
第 4 步:测试 等待一分钟,观察 HR 表自动分配 INMEMORY 属性。
FROM dba_tables WHERE owner='HR';
TABLE_NAME INMEMORY INMEMORY_COMPRESS
------------------ -------- -----------------
REGIONS ENABLED AUTO
LOCATIONS ENABLED AUTO
DEPARTMENTS ENABLED AUTO
JOBS ENABLED AUTO
EMPLOYEES ENABLED AUTO
JOB_HISTORY ENABLED FOR CAPACITY LOW
EMP ENABLED FOR QUERY LOW
COUNTRIES DISABLED
8 rows selected.
为什么 HR.COUNTRIES 没有自动启用?
ALTER TABLE hr.countries INMEMORY
*
ERROR at line 1:
ORA-64358: in-memory column store feature not supported for IOTs
将内存中的表填充到 IM 列存储中。
SQL> set echo on
SQL> begin
2 for i in (select constraint_name, table_name from dba_constraints where table_name='EMPLOYEES') LOOP
3 execute immediate 'alter table hr.employees drop constraint '||i.constraint_name||' CASCADE';
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> drop index hr.EMP_EMP_ID_PK;
drop index hr.EMP_EMP_ID_PK
*
ERROR at line 1:
ORA-01418: specified index does not exist
SQL>
SQL> INSERT INTO hr.employees SELECT * FROM hr.employees;
107 rows created.
SQL> /
214 rows created.
...
SQL> /
27392 rows created.
SQL> COMMIT;
Commit complete.
SQL> /
...
SQL> /
Commit complete.
SQL> COMMIT;
Commit complete.
为什么 ENABLED AUTO 表没有填充到 IM 列存储中? 内部统计数据还不足以识别 IM 列存储中的冷数据和热数据,以考虑哪些段可以填充到 IM 列存储中。
执行 /home/oracle/labs/M104783GC10/AutoIM_scan_AUTO.sql SQL 脚本,在 HR.EMPLOYEES 表中插入更多行,查询 HR.EMPLOYEES 表,然后可能将表自动填充到 IM 列存储中。
SQL> SELECT /*+ FULL(hr.employees) NO_PARALLEL(hr.employees) */ count(*) FROM hr.employees;
COUNT(*)
----------
107
SQL> SELECT /*+ FULL(hr.departments) NO_PARALLEL(hr.departments) */ count(*) FROM hr.departments;
COUNT(*)
----------
27
SQL> SELECT /*+ FULL(hr.locations) NO_PARALLEL(hr.locations) */ count(*) FROM hr.locations;
COUNT(*)
----------
23
SQL> SELECT /*+ FULL(hr.jobs) NO_PARALLEL(hr.jobs) */ count(*) FROM hr.jobs;
COUNT(*)
----------
19
SQL> SELECT /*+ FULL(hr.regions) NO_PARALLEL(hr.regions) */ count(*) FROM hr.regions;
COUNT(*)
----------
4
SQL> SELECT /*+ FULL(hr.emp) NO_PARALLEL(hr.emp) */ count(*) FROM hr.emp;
COUNT(*)
----------
3506176
将 HR 表的填充状态显示到 IM 列存储中。 您可能需要等待几分钟才能开始填充 EMPLOYEES 表。
SQL> SELECT segment_name, inmemory_size, bytes_not_populated, inmemory_compression FROM v$im_segments;
SEGMENT_NAME INMEMORY_SIZE BYTES_NOT_POPULATED INMEMORY_COMPRESS
------------------ ------------- ------------------- -----------------
PROMOTIONS 1310720 0 AUTO
SALES 1310720 0 AUTO
SALES 1310720 0 AUTO
TIMES 1310720 0 AUTO
COSTS 1310720 0 AUTO
SALES 1310720 0 AUTO
SALES_ZM 35717120 0 AUTO
SALES 1310720 0 AUTO
COSTS 1310720 0 AUTO
SALES 1310720 0 AUTO
COSTS 1310720 0 AUTO
SALES 1310720 0 AUTO
COSTS 1310720 0 AUTO
SALES 1310720 0 AUTO
SALES 1310720 0 AUTO
COSTS 1310720 0 AUTO
COSTS 1310720 0 AUTO
SALES 1310720 0 AUTO
EMP 24969216 125337600 FOR QUERY LOW
SALES 1310720 0 AUTO
COSTS 1310720 0 AUTO
SALES 1310720 0 AUTO
SALES 1310720 0 AUTO
23 rows selected.
Speak Your Mind