1. 说明
从18c开始支持Memoptimized Rowstore,可用于提高查询性能。针对频繁基于主键查询的SQL语句的性能提高十分明显。
其是通SGA中的已一块存储区,叫memoptimize pool,其大小通过MEMOPTIMIZE_POOL_SIZE设置,其中存储着启用了fast lookup表的散列索引。
可以通过CREATE TABLE或ALTER TABLE…MEMOPTIMIZE FOR READ语句来启用表的fast lookup。
fast lookup是通过memoptimize pool中的散列索引结构来实现的,它可以快速访问表的块,从而永久的固定在缓冲区缓存中,以避免磁盘I/O。当配置并由Oracle数据库自动维护memoptimization Rowstore时,将创建这个散列索引。当启用表进行快速查找时,表的块被固定在缓冲区缓存中,表上的查询使用memoptimization pool中的散列索引来提高性能。
启用fast lookup要求:
- 表不能被压缩
- 表必须有主键约束
2. 启用memoptimize pool
要使用fast lookup必须先配置memoptimize pool,COMPATIBLE初始化参数要设置为18.0.0及以上。
SQL> SHOW PARAMETER MEMOPTIMIZE_POOL_SIZE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memoptimize_pool_size big integer 0
SQL> ALTER SYSTEM SET MEMOPTIMIZE_POOL_SIZE=100M SCOPE=SPFILE;
System altered.
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1.1832E+10 bytes
Fixed Size 9010864 bytes
Variable Size 1.1799E+10 bytes
Database Buffers 16777216 bytes
Redo Buffers 7766016 bytes
Database mounted.
Database opened.
SQL> SHOW PARAMETER MEMOPTIMIZE_POOL_SIZE
NAME TYPE VALUE
------------------------------------ ------------------- ------------------
memoptimize_pool_size big integer 100M
3. 使用Fast Lookup
3.1. 启用Fast Lookup
可以创建表时指定MEMOPTIMIZE FOR READ,或者后面修改表时指定MEMOPTIMIZE FOR READ,都可以实现表启用fast lookup。
如:
l 创建表
SQL> create table cndba(id number(6) primary key,name varchar2(50))
memoptimize for read;
Table created.
l 修改
ALTER TABLE lei.cndba MEMOPTIMIZE FOR READ;
3.1.1. 查看执行计划
可以看到红色部分表示了,是利用了Fast Lookup。
SQL> explain plan for select name from cndba where id=3;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------
Plan hash value: 313818278
------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 40 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID READ OPTIM| CNDBA | 1 | 40 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN READ OPTIM | SYS_C006370 | 1 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------
2 - access("ID"=3)
14 rows selected.
3.2. 将表填充到Memoptimize Pool
execute DBMS_MEMOPTIMIZE.POPULATE('LEI','CNDBA');
3.3. 禁用Fast Lookup
ALTER TABLE lei.cndba NO MEMOPTIMIZE FOR READ;
3.3.1. 再看执行计划
不再使用fast lookup特性。
SQL> explain plan for select name from cndba where id=3;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------
Plan hash value: 313818278
------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 40 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| CNDBA | 1 | 40 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | SYS_C006370 | 1 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------
2 - access("ID"=3)
14 rows selected.
版权声明:本文为博主原创文章,未经博主允许不得转载。
Memoptimized Rowstore