优化利器In-Memory开启和效果

优化,利器,in,memory,开启,效果 · 浏览次数 : 83

小编点评

## In-Memory 选件简介 In-Memory 是一种 Oracle 数据库中的可选选件,可以用于优化数据读取性能。 12.1.0.2 版本中已推出了 In-Memory 选件,建议所有使用 19.8 及之后版本的用户的条件都要留给 In-Memory 一些内存区域。 **主要特性:** * 16GB 及以下免费使用 * 优化数据读取性能 * 支持各种查询类型 * 可指定 `inmemory_size` 参数控制内存大小 **测试效果:** 本文展示了在测试环境中设置 In-Memory 的性能差异。 * 使用 `select count(*) from L` 查询一张 50M 的表,普通 buffer cache 的性能为 0.02 秒。 * 使用 `select count(*) from L` 查询一张 50M 的表,In-Memory 的性能为 0.03 秒。 * 使用 `set timing on` 设置计时器,执行 `select count(*) from L` 语句。 * 在计时器结束后,发现 In-Memory 的执行时间比普通 buffer cache 快 2 倍。 **使用说明:** * 设置 `inmemory_size` 参数,例如 `SQL> alter system set inmemory_size=8G scope=spfile;` * 注释掉 `inmemory_size` 参数,默认值为 16GB。 * 使用 `show parameter inmemory_size` 查看当前设置。 * 使用 `alter table L inmemory;` 设置 `no inmemory` 属性,取消 In-Memory 设置。 **结论:** In-Memory 是 Oracle 数据库中一个性能提升选件,可以显著提高数据读取性能。 在设置 `inmemory_size` 参数时,可以根据性能需求调整内存大小。

正文

本文主要介绍Oracle In-Memory 选件,Oracle在12.1.0.2就已经推出了In-Memory这个选件,现在通常会建议所有使用19.8及之后版本的用户,有条件都要留给In-memory一点内存区域。
因为该选件在19.8之后推出了16GB及以下免费使用的福利,作为优化的又一利器。

1.如何开启

只需要最简单的inmemory_size参数设置。
如果是第一次设置这个参数,需要重启生效。我这里测试环境,假设设置8GB的In-Memory:

SQL> alter system set inmemory_size=8G scope=spfile;
System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 
SQL> startup
ORACLE instance started.

Total System Global Area 2.5367E+10 bytes
Fixed Size                 18608792 bytes
Variable Size            2248146944 bytes
Database Buffers         1.4496E+10 bytes
Redo Buffers               14942208 bytes
In-Memory Area           8589934592 bytes		<---  这里重新启动实例后,可以看到In-Memory的内存区域已经按照我们的设置开辟。
Database mounted.
Database opened.

SQL> show parameter inmemory_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
inmemory_size                        big integer 8G

2.测试效果

以一张我测试环境中的一张大表L(数据量50M,占空间5G+)来举例说明。

SQL> select round(bytes/1024/1024/1024,2) "GB" from user_segments where segment_name = 'L';

        GB
----------
      5.38

--将该表设置为inmemory:
SQL> alter table L inmemory;

--如果最终想去掉该表的inmemory设置,即设置为no inmemory:
SQL> alter table L no inmemory;

使用最简单的测试SQL用例:

vi select.sql

select count(*) from L;

vi select2.sql

select /*+ no_inmemory */ count(*) from L;

vi xplan.sql

set lines 200 pages 200
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

下面测试中开启计时。
执行前面已执行过的语句(确保都在内存区域中),然后对比二者性能差异,并查看执行计划确认;

SQL> set timing on
SQL> @select   

  COUNT(*)
----------
  53986608

Elapsed: 00:00:00.02	<---瞬间出结果,仅需0.02s!
SQL> @xplan

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  38aj72xpvgqfv, child number 1
-------------------------------------
select count(*) from L

Plan hash value: 1622156267

----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |      1 |        |      1 |00:00:00.02 |      13 |
|   1 |  SORT AGGREGATE             |      |      1 |      1 |      1 |00:00:00.02 |      13 |
|   2 |   TABLE ACCESS INMEMORY FULL| L    |      1 |     53M|     53M|00:00:00.02 |      13 |	<--- 这里唯一区别是有`INMEMORY`关键字。
----------------------------------------------------------------------------------------------


14 rows selected.

Elapsed: 00:00:00.03
SQL> @select2

  COUNT(*)
----------
  53986608

Elapsed: 00:00:02.22	<---即便多次反复查询,也都至少需要2s以上才能出结果。
SQL> @xplan

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  2t6ccax38rrgt, child number 0
-------------------------------------
select /*+ no_inmemory */ count(*) from L

Plan hash value: 1622156267	<--- 注意这里的Plan hash value和上面是一致的。

----------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |      1 |00:00:02.23 |     697K|    697K|
|   1 |  SORT AGGREGATE    |      |      1 |      1 |      1 |00:00:02.23 |     697K|    697K|
|   2 |   TABLE ACCESS FULL| L    |      1 |     53M|     53M|00:00:02.18 |     697K|    697K|	<--- 只是这里没有了`INMEMORY`关键字。
----------------------------------------------------------------------------------------------


14 rows selected.

Elapsed: 00:00:00.03	
SQL> 

上面简单对比了同样在内存中,计算count(*)这类统计操作,普通buffer cache与In-Memory的性能差异。
抛砖引玉,感兴趣的话快在自己的测试环境试试效果吧!

与优化利器In-Memory开启和效果相似的内容:

优化利器In-Memory开启和效果

本文主要介绍Oracle In-Memory 选件,Oracle在12.1.0.2就已经推出了In-Memory这个选件,现在通常会建议所有使用19.8及之后版本的用户,有条件都要留给In-memory一点内存区域。 因为该选件在19.8之后推出了16GB及以下免费使用的福利,作为优化的又一利器。

小知识:SQL Monitor Report的使用

在上一篇 优化利器In-Memory开启和效果 中,提到的两个SQL对比,使用的是传统的dbms_xplan.display_cursor方式来查看执行计划,好处是文本输出的通用性强,基本信息也都有。 但如果大家参加过我们的RWP培训,就会发现O原厂强烈推荐大家使用的一个工具是 SQL Monito

rt下降40%?程序并行优化六步法

并行优化在改善程序接口响应时间和吞吐量指标方面是个利器,所以本次结合前段时间做的一段长链路执行逻辑代码的优化,给大家讲讲程序并行优化的步骤及方法论。

[转帖]《Linux性能优化实战》笔记(20)—— 使用 tcpdump 和 Wireshark 分析网络流量

tcpdump 和 Wireshark 是最常用的网络抓包和分析工具,更是分析网络性能必不可少的利器。 tcpdump 仅支持命令行格式使用,常用在服务器中抓取和分析网络包。Wireshark 除了可以抓包,还提供了强大的图形界面和汇总分析工具,在分析复杂的网络情景时,尤为简单和实用。因而,在实际分

Go语言性能剖析利器--pprof实战

作者:耿宗杰 前言 关于pprof的文章在网上已是汗牛充栋,却是千篇一律的命令介绍,鲜有真正实操的,本文将参考Go社区资料,结合自己的经验,实战Go程序的性能分析与优化过程。 优化思路 首先说一下性能优化的一般思路。系统性能的分析优化,一定是从大到小的步骤来进行的,即从业务架构的优化,到系统架构的优

Java智能之Spring AI:5分钟打造智能聊天模型的利器

通过本文的介绍,我们深入了解了Spring AI项目的优势和特性,以及在实际应用中的快速实战示例。Spring AI作为一个高度抽象化的人工智能应用程序开发框架,为开发者提供了便捷的模型支持、灵活的功能模块交换和优化能力。它不仅能将AI模型输出映射为POJO,还能与主流矢量数据库提供商无缝集成,从而...

上周热点回顾(9.25-10.1)

热点随笔: · 在小公司编程是一种什么样的体验? (公众号_陶朱公Boy)· 一个混乱千万级软件项目 (烂人)· 《优化接口设计的思路》系列:第四篇—接口的权限控制 (sum墨)· C#开源且免费的Windows桌面快速预览神器 - QuickLook (追逐时光者)· .NET开发工作效率提升利器

背包DP——多重背包

多重背包也是 0-1 背包的一个变式。与 0-1 背包的区别在于每种物品有 k 个,而非一个。 朴素 直接把相同的每个物品视作各个单独的物品,没有关联,仅条件相同; 转换后直接用01背包的状态转移方程 注意:在大数据下容易爆空间时间 二进制分组优化 与朴素相比,优化利用二进制原理(任意数可以由多个不

如何科学地利用MTTR优化软件交付流程?

谷歌提出的衡量 DevOps 质量的 DORA 指标让 MTTR(平均恢复时间) 名声大振。在本文中,你将了解到 MTTR 的作用、为什么它对行业研究很有用、你可能被它误导的原因以及如何避免 MTTR 产生的弊端。 ## MTTR 究竟是在测量什么? MTTR 指平均恢复时间,既是 Mean Tim

活字格性能优化技巧(1)——如何利用数据库主键提升访问性能

本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 大家都知道,活字格作为企业级低代码开发平台,拥有6大引擎,3大能力,能够高效落地企业级应用。在每年的应用大赛中也能看到很多格友利用活字格做了很多复杂的应用,例如2021年