大发棋牌技巧_Oracle 19C性能优化新特性Memoptimize Rowstore 之Fast Lookup_甲骨文数据库技术

大发棋牌网址

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

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

摘要

大发棋牌网址每次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等有大量数据且频繁基于主键查询的表对象性能优化。



今日推荐