通过在 CREATE TABLE
或 ALTER TABLE
语句中包含 INMEMORY
子句来启用IM列存储的表。通过在 CREATE TABLE
或 ALTER TABLE
语句中包含 NO INMEMORY
子句来禁用IM列存储的表。
此部分包含以下主题:
CREATE TABLE
语句中包括 INMEMORY
子句,可以为新表启用IM列存储。ALTER TABLE
语句中包含INMEMORY
子句来启用现有表的IM列存储。通过在ALTER TABLE
语句中包含 NO INMEMORY
子句来禁用表的IM列存储。通过在 CREATE TABLE
语句中包括INMEMORY
子句,可以为新表启用IM列存储。
要为新表启用IM列存储:
1. 确保数据库已启用IM列存储。
请参见 “为数据库启用IM列存储”。
2. 以具有创建表所需的特权的用户身份登录到数据库。
3. 运行具有 INMEMORY
子句或 NO INMEMORY
子句的 CREATE TABLE
语句。
通过在 ALTER TABLE
语句中包含 INMEMORY
子句来为现有表启用IM列存储。通过在 ALTER TABLE
语句中包含 NO INMEMORY
子句来为表禁用IM列存储。
要为现有表启用或禁用IM列存储,请完成以下步骤:
请参见“为数据库启用IM列存储”。
ALTER TABLE
特权的用户身份登录数据库。INMEMORY
子句或 NO INMEMORY
子句的 ALTER TABLE
语句。以下示例说明如何为表启用或禁用IM列存储。
示例4-3创建表并为它启用IM列存储
以下示例创建 test_inmem
表,并为它启用IM列存储:
CREATE TABLE test_inmem (
id NUMBER(5) PRIMARY KEY,
test_col VARCHAR2(15))
INMEMORY;
此示例使用 INMEMORY
子句的默认值: MEMCOMPRESS FORQUERY
和 PRIORITY NONE
。
示例4-4为表启用IM列存储
以下DDL语句启用IM列存储的 sh.sales
表:
ALTER TABLE sh.sales INMEMORY;
上述语句使用 INMEMORY
子句的默认值: MEMCOMPRESS FORQUERY
和 PRIORITY NONE
。
以下查询将导致sales
的完全扫描,这会将表填充到IM列存储中:
SELECT /*+ FULL(sales) NO_PARALLEL(sales) */ COUNT(*) FROM sh.sales;
以下查询显示 sales
的总体状态(包括样例输出):
COL OWNER FORMAT a3
COL NAME FORMAT a10
COL STATUS FORMAT a20
SELECT OWNER, SEGMENT_NAME NAME,
POPULATE_STATUS STATUS
FROM V$IM_SEGMENTS;
OWN NAME STATUS
--- ---------- --------------------
SH SALES COMPLETED
以下查询计算压缩比。该查询假定表没有在磁盘上进一步压缩。
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a5
SET PAGESIZE 50000
SELECT v.OWNER, v.SEGMENT_NAME, v.BYTES ORIG_SIZE,
v.INMEMORY_SIZE IN_MEM_SIZE,
ROUND(v.BYTES / v.INMEMORY_SIZE, 2) COMP_RATIO
FROM V$IM_SEGMENTS v
ORDER BY 4;
OWNER SEGME ORIG_SIZE IN_MEM_SIZE COMP_RATIO
----- ----- ---------- ----------- ----------
SH SALES 851968 1310720 .65
SH SALES 835584 1310720 .64
SH SALES 925696 1310720 .71
SH SALES 958464 1310720 .73
SH SALES 950272 1310720 .73
SH SALES 786432 1310720 .6
SH SALES 876544 1310720 .67
SH SALES 753664 1310720 .58
SH SALES 1081344 1310720 .83
SH SALES 901120 1310720 .69
SH SALES 925696 1310720 .71
SH SALES 933888 1310720 .71
SH SALES 843776 1310720 .64
SH SALES 999424 1310720 .76
SH SALES 581632 1507328 .39
SH SALES 696320 1507328 .46
16 rows selected.
示例4-5使用FORCAPACITY LOW压缩启用表的IM列存储
以下DDL语句启用IM列存储的 oe.product_information
表,并指定压缩方法 FOR CAPACITY LOW
:
ALTER TABLE oe.product_information
INMEMORY
MEMCOMPRESS FOR CAPACITY LOW;
前面的DDL语句使用 PRIORITY
子句的默认值,即 NONE
。以下查询扫描 oe.product_information
表以填充它(包括样例输出):
SELECT /*+ FULL(p) NO_PARALLEL(p) */ COUNT(*)
FROM oe.product_information p;
COUNT(*)
----------
288
以下查询计算压缩比(包括样例输出):
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a19
SET PAGESIZE 50000
SELECT v.OWNER, v.SEGMENT_NAME, v.BYTES ORIG_SIZE,
v.INMEMORY_SIZE IN_MEM_SIZE,
ROUND(v.BYTES / v.INMEMORY_SIZE, 2) COMP_RATIO
FROM V$IM_SEGMENTS v
WHERE SEGMENT_NAME LIKE 'P%'
ORDER BY 4;
OWNER SEGMENT_NAME ORIG_SIZE IN_MEM_SIZE COMP_RATIO
----- ------------------- ---------- ----------- ----------
OE PRODUCT_INFORMATION 98304 1310720 .08
示例4-6使用具有HIGH数据填充优先级启用表的IM列存储
以下DDL语句为表 oe.product_information
启用IM列存储,并指定 PRIORITY HIGH
以填充IM列存储中的表数据:
ALTER TABLE
oe.product_information
INMEMORY
PRIORITY HIGH;
示例4-7使用FORCAPACITY HIGH压缩和LOW数据填充优先级为表启用IM列存储
以下查询显示 oe.product_information
表的优先级和压缩设置:
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a19
SET PAGESIZE 50000
SELECT v.OWNER, v.SEGMENT_NAME, v.INMEMORY_PRIORITY,
v.INMEMORY_COMPRESSION
FROM V$IM_SEGMENTS v
WHERE SEGMENT_NAME LIKE 'P%';
OWNER SEGMENT_NAME INMEMORY INMEMORY_COMPRESS
----- ------------------- -------- -----------------
OE PRODUCT_INFORMATION HIGH FOR CAPACITY LOW
以下DDL语句更改 oe.product_information
表以使用FOR CAPACITY HIGH
表压缩和PRIORITY LOW
:
ALTER TABLE oe.product_information
INMEMORY
MEMCOMPRESS FOR CAPACITY HIGH
PRIORITY LOW;
示例4-8为分区表启用IM列存储
以下DDL语句创建名为 range_sales
的分区表,并为IM列存储中的前三个分区指定不同的压缩级别。最后两个分区未填充到IM列存储中。
CREATE TABLE range_sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
(PARTITION SALES_Q4_1999
VALUES LESS THAN (TO_DATE('01-JAN-2015','DD-MON-YYYY'))
INMEMORY MEMCOMPRESS FOR DML,
PARTITION SALES_Q1_2000
VALUES LESS THAN (TO_DATE('01-APR-2015','DD-MON-YYYY'))
INMEMORY MEMCOMPRESS FOR QUERY,
PARTITION SALES_Q2_2000
VALUES LESS THAN (TO_DATE('01-JUL-2015','DD-MON-YYYY'))
INMEMORY MEMCOMPRESS FOR CAPACITY,
PARTITION SALES_Q3_2000
VALUES LESS THAN (TO_DATE('01-OCT-2015','DD-MON-YYYY'))
NO INMEMORY,
PARTITION SALES_Q4_2000
VALUES LESS THAN (MAXVALUE));
示例4-9禁用表的IM列存储
要禁用表的IM列存储,请指定 NO INMEMORY
子句。以下示例禁用IM列存储的 oe.product_information
表:
ALTER TABLE oe.product_information NO INMEMORY;
您可以查询V$IM_SEGMENTS
视图以列出在IM列存储中填充的数据库对象。
(待续)
IM系列文章列表:
第一章 Oracle Database In-Memory 相关概念(IM-1.1)
第一章 Oracle Database In-Memory 相关概念(续)(IM-1.2)
第二章 Oracle Database In-Memory 体系结构(上) (IM-2.1)
第二章 IM 体系结构:CPU架构:SIMD向量处理(IM-2.3)
第四章 为In-Memory 启用填充对象(IM-4.1 第一部分)
山东Oracle用户组(Shandong Oracle User Group),简称:SDOUG,是一个充满朝气、年轻的非营利性组织,旨在为济南及周边地区技术爱好者提供一个交流平台。SDOUG会不定期组织线下技术分享活动,促进本地区及周边IT技术的发展、帮助技术爱好者提高自己。分享技术、分享快乐,SDOUG在路上。