上接IM 5.6。本章为IM系列第五章 使用In-Memory表达式优化查询第七部分配置使用IM表达式的基本任务。
INMEMORY_EXPRESSIONS_USAGE
的默认设置使数据库能够同时使用动态和静态IM表达式。您必须使用DBMS_INMEMORY_ADMIN
填充IM列存储中的表达式。
通常,您按以下顺序执行IM表达式任务:
· (可选)更改数据库可以使用的IM表达式的类型。
请参阅“配置使用IM表达式”。
· 捕获并填充IM表达式。
请参阅“捕获和填充IM表达式”。
· (可选)删除一些或所有IM表达式。
请参阅“删除IM表达式”。
(可选)选择哪些类型的IM表达式符合条件,或禁用所有IM表达式的填充。
先决条件
要使数据库能够使用IM表达式,必须满足以下条件:
· INMEMORY_SIZE
初始化参数设置为非零值。
· 初始化参数COMPATIBLE
的值设置为12.2.0或更高。
注:
在Oracle Real ApplicationsCluster(RAC)数据库中,INMEMORY_EXPRESSIONS_USAGE
初始化参数在每个数据库实例上不需要都相同的值。每个IMCU独立列出虚拟列。每个IMCU可以基于初始化参数值和填充或重新填充IMCU时存在的虚拟列来实现不同的表达式。
要配置使用IM表达式:
1. 以具有适当权限的用户身份登录数据库。
2. 要配置使用IM表达式,请使用ALTERSYSTEM
语句将INMEMORY_EXPRESSIONS_USAGE
设置为以下值之一:
· ENABLE
(默认)—启用动态和静态IM表达式
· STATIC_ONLY
—仅启用静态IM表达式
· DYNAMIC_ONLY
—仅启用动态IM表达式
· DISABLE
—禁用所有IM表达式
示例5-1禁用IM表达式
以下语句禁用IM列存储中IM表达式的存储:
ALTER SYSTEM SET INMEMORY_EXPRESSIONS_USAGE='DISABLE';
IME_CAPTURE_EXPRESSIONS
过程在指定的时间范围内捕获并填充数据库中最常访问的20个(“最热”)表达式。过程强制在最近调用DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS
中捕获的表达式。
无论何时调用IME_CAPTURE_EXPRESSIONS
过程,数据库都会查询表达式评估的统计信息存储库(Expression StatisticsStore 简称:ESS),并仅在IM列存储中至少部分填充的表上考虑表达式。数据库将20个最热表达式添加到其各自的表中作为隐藏的虚拟列,前缀为字符串SYS_IME
,并应用默认的INMEMORY
列压缩子句。如果在上一次调用期间添加的任何SYS_IME
列不再在最新的前20个列表中,则数据库将它们标记为 NOINMEMORY
。
如果不调用IME_POPULATE_EXPRESSIONS
,则在重新填充其父IMCU时,数据库会逐渐重新填充SYS_IME
列。如果表未重新填充,则数据库不会重新填充由IME_CAPTURE_EXPRESSIONS
过程捕获的新SYS_IME
列。IME_POPULATE_EXPRESSIONS
通过强制重新填充来解决此问题。
在内部,IME_POPULATE_EXPRESSIONS
过程调用具有INMEMORY
属性的SYS_IME
列的所有表的DBMS_INMEMORY.REPOPULATE
。要在指定的表子集中填充SYS_IME
列,请使用DBMS_INMEMORY.REPOPULATE
而不是DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS
。
先决条件
要使数据库能够捕获IM表达式,必须满足以下条件:
· INMEMORY_EXPRESSIONS_USAGE
初始化参数必须设置为除DISABLE
之外的值。
· INMEMORY_SIZE
初始化参数设置为非零值。
· 初始化参数COMPATIBLE的值必须设置为12.2.0或更高。
捕获和填充IM表达式:
1. 以具有适当权限的用户身份登录数据库。
2. 使用以下任何参数执行DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS
:
· CUMULATIVE
— 创建数据库后,数据库会考虑所有表达式统计信息。
· CURRENT
— 数据库仅考虑过去24小时的表达式统计信息。
3. (可选)执行DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS
强制立即显示最新的IM表达式。
示例5-2捕获过去24小时内的前20个IM表达式
此示例仅使用最后一天收集的统计信息捕获IM表达式,然后强制立即填充:
EXEC DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS('CURRENT');
EXEC DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS();
DBA_IM_EXPRESSIONS
的以下查询显示当前填充了两个IM表达式(提供了示例输出):
COL OWNER FORMAT a6
COL TABLE_NAME FORMAT a9
COL COLUMN_NAME FORMAT a25
SET LONG 50
SET LINESIZE 150
SELECT OWNER, TABLE_NAME, COLUMN_NAME, SQL_EXPRESSION
FROM DBA_IM_EXPRESSIONS;
OWNER TABLE_NAM COLUMN_NAME SQL_EXPRESSION
------ --------- ------------------------- ---------------------------------------------
HR EMPLOYEES SYS_IME00010000001746FD 12*("SALARY"*NVL("COMMISSION_PCT",0)+"SALARY")
HR EMPLOYEES SYS_IME00010000001746FE ROUND("SALARY"*12/52,2)
DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
过程删除数据库中的所有SYS_IME
表达式虚拟列。DBMS_INMEMORY.IME_DROP_EXPRESSIONS
过程从表中删除一组指定的SYS_IME
虚拟列。
删除SYS_IME
列的典型原因是空间和性能。表的SYS_IME
列的最大数量,不管属性是INMEMORY
还是NOINMEMORY
,,都是50.在达到表的50个表达式限制之后,数据库将不会添加新的SYS_IME
列。要为新表达式创建空间,必须使用DBMS_INMEMORY.IME_DROP_EXPRESSIONS
或DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
过程手动删除SYS_IME
列。
IME_DROP_ALL_EXPRESSIONS
过程从所有表中删除所有SYS_IME
列,而不管它们是否具有INMEMORY
属性。实际上,该过程充当数据库范围的重置按钮。
对于具有SYS_IME
列的段,使用IME_DROP_ALL_EXPRESSIONS
触发所有IMEU和IMCU的下降。例如,如果50个填充表每个都有一个SYS_IME
列,则IME_DROP_ALL_EXPRESSIONS
将从IM列存储中删除所有50个表。要再次填充这些段,您必须使用DBMS_INMEMORY.POPULATE
过程或执行全表扫描。
先决条件
要删除IM表达式,以下条件必须为true:
· INMEMORY_EXPRESSIONS_USAGE
初始化参数设置为除DISABLE
之外的值。
· INMEMORY_SIZE
初始化参数设置为非零值。
· COMPATIBLE
初始化参数设置为12.2.0或更高。
删除IM表达式:
1. 以具有适当权限的用户身份登录数据库。
2. 执行 DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
或DBMS_INMEMORY.IME_DROP_EXPRESSIONS
。
如果执行IME_DROP_EXPRESSIONS
,则指定以下参数:
· schema_name
—包含In-Memory表的schema
的名称
· table_name
—In-Memory 表名称
· column_name
—SYS_IME
列的名称。默认情况下,该值为null,它指定此表中的所有SYS_IME
列。
示例5-3删除表中的所有IM表达式
此示例删除hr.employees
表中的所有IM表达式:
EXEC DBMS_INMEMORY.IME_DROP_EXPRESSIONS('hr', 'employees');
未完待续。