Oracle 21c 新特性 自动In-Memory特性




  • 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表中插入行。

    $ cd /home/oracle/labs/M104783GC10
    $ /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。

    $ sqlplus sys@PDB21 AS SYSDBA
    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 表。

    SQL> ALTER TABLE hr.job_history INMEMORY MEMCOMPRESS FOR CAPACITY LOW;

    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,然后重新启动数据库实例。

    SQl> CONNECT / AS SYSDBA
    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。

    SQl> CONNECT sys@PDB21 AS SYSDBA
    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。

    SQl> SHOW PARAMETER 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。

    SQl> ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL=HIGH SCOPE=SPFILE;

    System altered.

    SQL> SHUTDOWN IMMEDIATE
    Pluggable Database closed.
    SQL> STARTUP
    Pluggable Database opened.

     

    第 4 步:测试 等待一分钟,观察 HR 表自动分配 INMEMORY 属性。

    SQL> SELECT table_name, inmemory, inmemory_compression
    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 没有自动启用?

    SQL> ALTER TABLE hr.countries INMEMORY;
    ALTER TABLE hr.countries INMEMORY
    *
    ERROR at line 1:
    ORA-64358: in-memory column store feature not supported for IOTs

     

    将内存中的表填充到 IM 列存储中。

    SQL> @/home/oracle/labs/M104783GC10/AutoIM_scan_AUTO.sql
    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> @/home/oracle/labs/M104783GC10/AutoIM_scan.sql
    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> COL segment_name FORMAT A18
    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

    *

    京ICP备14059771号-2