oracle max函数速度慢_详解Oracle内存架构 系统全局区SGA、高速缓存缓冲区、共享池...

内存结构

Oracle Instance是Oracle RDBMS的核心之一,负责RDBMS的管理功能。Oracle Instance主要由内存池SGA后台进程组成。

98931fece26ee113e4666331f0e7a85c.png

系统全局区SGA

697eb70ff2b9e17022647e52a33e3f06.png

内存池SGA的默认Size,会在安装Oracle的时候会根据LinuxOS的sysctl.conf参数文件来决定:

kernel.shmall = 2097152kernel.shmmax = 2147483648kernel.shmmni = 4096kernel.sem = 250 32000 100 128net.ipv4.ip_local_port_range = 1024 65000net.core.rmem_default = 1048576net.core.rmem_max = 1048576net.core.wmem_default = 262144net.core.wmem_max = 262144123456789

查看SGA的Size

SQL> conn /as sysdbaConnected.SQL> show user;USER is "SYS"SQL> select * from v$sga;NAME VALUE-------------------- ----------Fixed Size 2022144Variable Size 503317760Database Buffers 1627389952Redo Buffers 14753792SQL> show sgaTotal System Global Area 2147483648 bytes #对应kernel.shmmax = 2147483648Fixed Size 2022144 bytesVariable Size 503317760 bytesDatabase Buffers 1627389952 bytesRedo Buffers 14753792 bytes123456789101112131415161718

SGA(System Global Area)是与Oracle性能关系最大的核心部分,也是对Oracle进行调优的主要考量。SGA内存池会在Instance启动时被分配,在Instance关闭时被释放。在一定范围内,SGA可以在Instance运行时通过自动方式响应DBA的指令。如果想对SGA进行调优还必须理解SGA所包含如下几种数据结构:


高速缓存缓冲区(数据库缓冲区)

数据库缓冲区是oracle执行SQL语句的区域

例如在更新数据时,用户执行的SQL语句不会直接对磁盘上的数据文件进行更改操作,而是首先将数据文件复制到数据库缓冲区缓存(就是说数据库缓冲区里会存放着SQL相关数据文件副本),再更改应用于数据库缓冲区缓存中这些数据块的副本。而且数据块副本将在缓存中保留一段时间,直至其占用的缓冲区被另一个数据库覆盖为止(缓冲区Size有限)。

在查询数据时,为了提高执行效率,查询的数据也要经过缓存。建立的Session会计算出那些数据块包含关键的行,并将它们复制到数据库缓冲区中进行缓存。此后,相关关键行会传输到Session的PGA作进一步处理。这些数据块也会在数据库缓存区缓存中保留一段时间。

一般情况下,被频繁访问的数据块会存在于数据库缓冲区缓存中,从而最大程度地减少对磁盘I/O的需要。

那什么时候会将被更新的数据块副本写入到磁盘中的数据文件呢?

答案就是:如果在缓冲区缓存中存储的数据块与磁盘上的数据块不同时,那么这样的缓冲区常称为”脏缓冲区”,脏缓冲区中的数据块副本就必须写回到磁盘的数据文件中。

调优:数据库缓冲区缓存的大小会对性能产生至关重要的影响,具体需要多大的Size才能成为最佳配比还要结合实际的生产环境而言。总体而言可以依据以下两点基本要求来判断:

1. 缓存应足够大,以便能缓存所有被频繁访问的数据块。如果缓存过小,那么将导致磁盘I/0活动过多,因为频繁访问的数据块持续从磁盘读取,并由其他数据块使用和重写,然后再从磁盘读取。

2. 但也不能太大,以至于它会将极少被访问的块也一并加入到缓存中,这样会增长在缓存中搜索的时间。

数据库缓冲区缓存在Instance启动时被分配。从数据库9i开始,可以随时将其调大或调小。可以采用手动方式重调,也可以根据工作负荷自动重调大小(事务)。

修改缓冲区DB_CACHE_SIZE地方法

#Step1. 查看SGA的大小:因为DB_CACHE_SIZE的size受SGA的影响SQL> show parameter sga_max_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 2G#Step2. 查看show parameter shared_pool_size的大小SQL> show parameter shared_pool_size; NAME TYPE VALUE------------------------------------ ----------- ------------------------------shared_pool_size big integer 0#Step3. 计算DB_CACHE_SIZE的大小:shared_pool_size + db_cache_size = SGA_MAX_SIZE * 70%#Step4. 修改DB_CACHE_SIZE的大小SQL> alter system set db_cache_size=1433M scope=spfile sid='demo';System altered.SQL> conn sys /as sysdbaEnter password: ********Connected.SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area 2147483648 bytesFixed Size 2022144 bytesVariable Size 503317760 bytesDatabase Buffers 1627389952 bytesRedo Buffers 14753792 bytesDatabase mounted.Database opened.SQL> show parameter db_cache_size12345678910111213141516171819202122232425262728293031323334353637

日志缓冲区

日志缓冲区是小型的、用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域。主要作用是提供更加快的日志处理效率。


共享池

共享池的大小也对性能产生重要影响

1. 它应该足够大,以便缓存所有频繁执行的代码和频繁访问的对象定义。如果共享池过小,则性能下降,因为服务器会话将反复抢夺其中的空间来分析语句,此后,这些语句会被其他语句重写,在重新执行时,将不得不再次分析。如果共享池小于最优容量,则性能将下降。但有一个最小容量,如果低于此限度,则语句将失败。

2. 但也不能过大,以至于连仅执行一次的语句也要缓存。过大的共享池也会对性能产生不良影响,因为搜索需要的时间过长。

确定最优容量是一个性能调整问题,大多数数据库都需要一个数百MB的共享池。有些应用程序需要1GB以上的共享池,但很少有应用程序能够在共享池小于100MB时充分运行。共享池内有下列三种数据结构:

  • 库缓冲:存储最近执行的代码
  • 数据字典缓存:存储最近使用的对象定义
  • PL/SQL缓冲区:存储的PL/SQL对象是过程、函数、打包的过程、打包的函数、对象类型定义和触发器。

手动的调整共享池的大小

 //显示可以动态重设大小的SGA组件的当前最大和最小容量ALTER SYSTEM SET SHARED_POOL_SIZE = 110M;123

其他结构

这里暂时不做详细介绍。

大型池

主要用途是供共享的服务器进程使用。

JAVA池

只有当应用程序需要在数据库中运行java存储程序时,才需要java池。


后面小编会分享更多运维和DBA的干货,感兴趣的朋友走一波关注哩~

be26642c6b433b4eb43c749996d16522.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值