自动内存(SGA)管理
如何调整最佳PGS SIZE
1. 首先估计一个 PGA_AGGREGATE_TARGET 参数值。
2. 使实例运行在预期的负载下,通过 Oracle 收集的 PGA 统计信息来监控系统性能,从而决定当前参数值是否适当。
3. 根据 PGA 顾问工具的统计数据来调整 PGA_AGGREGATE_TARGET 参数的值。
SQL> show parameter workarea_size_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ workarea_size_policy string AUTO
当用户启用了自动共享内存管理后,需要用户经常调整的内存组件将被Oracle自动地调整.这样的内存组件包括:
- shared pool(供sql 及 pl/sql执行使用)
- java pool(供java程序执行适用)
- large pool(用于大量的内存分配,例如RMAN的备份缓冲区)
- database buffer pool
- stream pool
用户无需显示地为这些内存组件设定容量,默认情况下这些组件的容量参数均显示为0.当某个内存组件需要扩展容量时,她将想系统发出请求,Oracle则通过内部的自动调节机制将其他组件的内存转移给她。上述过程对用户是透明的.
oracle组件负责监控各个内存组件的性能.实例根据内部视图的信息及其他统计信息来决定如何在各个自动管理的组件间分配内存达到最优.这样,当工作负载改变时内存就能够被重新分配,从而确保系统在新负载下也能获得最优性能.内存分配调整算法会同时考虑系统运行的短期与长期趋势.
对于自动管理的内存组件,用户可以为其指定最小容量.当用户了解了其应用所需的各个内存组件的容量时,就可以使用此功能.(个人观点:伴随业务的发展变化,设定其最小容量后,其内存需求也会随之变化,还不如保持其自动管理功能;真正需要关心的是可以适当调整总的pga_aggregate_target参数大小即可)
如果数据库使用了服务器参数文件(server parameter file->spfile),那么自动调整内存组件的参数在实例关闭后依然能被保留.系统下次启动时可以使用上次关闭时保留的参数.
使用自动SGA内存管理的最大好处是:各个SGA组件的容量是灵活可变的.能够适应不同的工作负载而无需用户干预.除了是可用内存最大化之外,自动共享内存管理还有助于提供系统性能.采用手工内存管理时,已编译的SQL语句可能会因为共享池容量不足而 被清除出共享池.这将导致频繁的硬解析(hard parse)进而影响系统性能.而启用了自动内存管理后,内部调节算法将监控系统性能,如认为增大共享池有助于减少硬解析的话就会对内存组件做出相应调整.此功能提高了系统性能,且无需想系统添加资源,也无需任何手工调整操作.
空间回收
数据段收缩属于联机操作,当表的数据段被收缩时,此表依然可以进行查询或DML操作.此外,数据段收缩无需额外的存储空间.本地收缩与通过联机重定义的方式收缩相比更有优势.用户可以在夜间定期调度作业在执行数据库对象的收缩操作,而无需为数据库提供额外的存储空间.
采用了自动段空间管理(automatic segment space management)的表空间中,数据段收缩可以作用于
- 堆表(heap-orgnized table)
- 索引表(index-organized table)
- 索引表的溢出段(row overflow area)
- LOB对象
- LOB段
- 物化视图
- 允许行移动的索引
如果对带有索引的表进行数据段收缩操作,当数据行发生移动时oracle能够自动地维护索引.但用户自定义的触发器不会被触发,因为数据段收送属于物理操作,对应用程序没有影响.
Oracle服务
一个服务可以跨越一个数据库的多个实例,还可以跨一个集群的多个数据库,而一个实例也能够支持多个服务.
ASM(自动存储管理)
磁盘组
每个自动存储管理文件只能存在一个磁盘组内.但一个磁盘组可以存储属于不同数据库的数据文件,一个数据库也能够使用多个磁盘组提供的存储资源.管理员可以为数据库指定一个或多个默认的磁盘组来存储其数据文件.
大部分数据库都会使用多个磁盘组.使用多个磁盘组的原因如下:
- 应将不同容量或不同性能的磁盘划分为不同的磁盘组.
- 应根据外部冗余能力(external redundancy)来划分磁盘组:具备相同外部冗余能力的磁盘应划入统一磁盘组,而外部冗余能力不同的磁盘不应化为统一磁盘组.
- 将数据库去(database area)与快速恢复区(flash recovery area)放置在不同的磁盘组.
磁盘组的类型
- 正常冗余
- 高冗余
- 外部冗余
Oracle instance -> ASMB(负责实例通信) <--- asm instance
如何判断oracle是自动内存管理的?
参考意见:
通过查看命令:show parameter sga,显示如果sga_target值为0,表示手动管理;非0是自动管理.
SQL> show parameter sga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 1584M sga_target big integer 0