Oracle 19C性能优化新特性Memoptimize Rowstore 之Fast Lookup

更新日期:2019-03-13
甲骨文数据库技术

摘要

每次Oracle 新版本带来新特性总是引人注目。在19C中,我们可以通过Memoptimize Rowstore来提升基于主键值的表查询速度(Fast Lookup)及数据写入速度(Fast Ingest)。这是相对于In Memory Column Store的另一个新功能。本文主要介绍基于Memoptimize Rowstore的快速查询(Fast Lookup)功能。将来我们另文介绍基于Memoptimize Rowstore 的Fast Ingest功能。

正文

Oracle 12C 中引入了In Memory Column Store的新特性,该功能将热表以列的形式存放在独立内存中,以提升聚合类查询的性能。在18C版本中,Oracle推出了Memoptimize Rowstore新功能,该功能极大提升基于主键值表查询的性能,SQL查询可以直接通过主键键值访问到Memoptimize Pool内存中的数据块,减少了buffer cache访问、磁盘IO及相关CPU的消耗,从而提升查询的性能。19C中,Oracle增强了Memoptimize Rowstore的功能,加入Fast Ingest,通过内存来提升主键表的记录插入速度。我们从字面上可以理解,Rowstore指在内存中存放的数据是以行式存储的。与In Memory Column Store记录以列式存储的性能区别在于,行式存储方式更利于对表内整行数据进行的检索。与In Memory类似,Memoptimize Rowstore 配置步骤非常简单,同样无需对应用SQL进行修改。我们只需分配Memoptimize Pool内存空间并指定需要存放在Rowstore内的表就可使用该功能了。

在介绍该功能的使用前,我们先了解一下Memoptimize Rowstore的内部机制。Memoptimize Rowstore使用SGA(图一)中的一块独立内存区域(Memoptimize Pool)来存放相关表的哈希索引(Hash Index)和表的数据块(图二)。Memoptimize Pool中75%的空间分配给Buffer,25%空间分配给哈希索引。Oracle自动为Memoptimize Pool中的表对象创建哈希索引并进行维护,无需人工干预。对于需要进行快速查询的表对象,我们只需要通过CREATE TABLE 或ALTER TABLE语句来指定表的MEMOPTIMIZE FOR READ属性,就能控制表是否通过Memoptimize Rowstore进行优化。需要注意的是,需要存放在Memoptimize Pool内的表只能是heap-organized表,表必须有主键且不能是压缩表。

图一

图二

下面我们简要介绍一下Memoptimize Rowstore快速查询的使用步骤。

1.

启用Memoptimize Rowstore。

数据库版本必须18C或以上。指定实例启动参数MEMOPTIMIZE_POOL_SIZE的大小,该参数不能动态调整,需要重启实例。需要注意Memoptimize Pool是个固定的内存空间,意味着其不受自动内存管理功能(Automatic Memory Management)控制。数据库SGA_TARGET自动管理不会根据数据库压力自动调整Memoptimize Pool的大小。

2.

重启实例,检查Memoptimize Pool是否生效

SQL> SHOW PARAMETER MEMOPTIMIZE_POOL_SIZE
 
NAME                   TYPE         VALUE
---------------------  -----------  -----
memoptimize_pool_size  big integer  10G

3.

使用CREATE TABLE 或ALTER TABLE语句来指定表的MEMOPTIMIZE FOR READ属性

CREATE TABLE flookup (

     id       NUMBER(5) PRIMARY KEY, --表必须有PK

     test_col  VARCHAR2(15))

MEMOPTIMIZE FOR READ;

ALTER TABLE sh.sales MEMOPTIMIZE FOR READ;

4.

使用DBMS_MEMOPTIMIZE.POPULATE将表数据加载至Memoptimize Pool内,数据加载完成后,基于Memoptimize Rowstore的快速查询功能立即生效。

execute DBMS_MEMOPTIMIZE.POPULATE("SH","SALES");

5.

关闭表的快速查询功能。使用ALTER TABLE 指定表NO MEMOPTIMIZE FOR READ 属性。

6.

查询表记录。基于Memoptimize Rowstore 的快速查询适用于带主键值的查询语句。

如以下查询:

SELECT * FROM customer WHERE cust_id = 10;  

新特性Memoptimize Rowstore快速查询是针对有主键表的行式数据查询的一个优化功能,其配置简单且无需修改应用。该功能特别适用于IoT等有大量数据且频繁基于主键查询的表对象性能优化。



今日推荐
----------------------------------------
友情链接:张晨莹 饶建云 李唐娜 花团锦簇中显唯美笑容 西汉高速网上订票 开口鲨 吴裔雄 快乐病栋 铭天传奇 朱双双 美人泪登意报 梦幻西游知识老人 蒙复华 某公司高管被当街割鸡 卡普利希托 蓝猫香侬犬业 清疣散 圣域公主 情爱阁商城 脂老虎同路人俱乐部 沈蔓歌 小女仆的秘密日记 希金诺 许梓荣 狂绝九天 熊熊偷心 杨希嫣 嘉友团 全城热恋乡村版张成 奈尼芬多 校园甜心派全集 氏族岗哨 寒冬之刃 邪魂狩 三国美色 萧璠网 吴美珩三级 蓟县haobc 奇库变速器 真假大亨 作嗳的全部视频 雨心遗爱 卡加尼舒 马士奇酱肉 久昕网 连珠妙手 施诺卡 快尚诚品 清水不见底lucy 瑟拉提克领巢者