实例内存优化
开启自动内存管理
1. 设置memory_max_target
alter system set memory_max_target=1G scope=spfile; /*init.ora memory_max_target = 2000M memory_target = 1000M*/
2. 关闭sga_target和pga_aggregate_target的设置
alter system set sga_target = 0; alter system set pga_aggregate_target = 0;
3. 设置memory_target来开启自动内存管理
alter system set memory_target=1000M
数据库开始自动内存管理,通过memory_target/memory_max_target设置的数据,系统会根据工作负载来增加或减少分配给不同组件的内存值(memory_max_target > PGA + SGA)
sga,读取数据块的cache,共享语句,日志等的cache
pga,排序,散列等
如果使用了一个较小的缓冲池,为防止过期,可以使用多个缓冲池,缓冲区告诉缓存之外,包含keep/recycle缓冲区,作用就是将频繁访问的数据集中化独立cache,将大对象访问几次的及时回收
db_keep_cache_size=1000m db_recycle_cache_size=1000m alter table tt storage (buffer_pool=keep)
虽然是自动内存管理,但可以设置pga_aggregate_target的值而不必重启db,将会从memory_target减去下面的设置分配个sga
alter system set pga_aggregate_target = 1000M;
查看实例中内存分配的情况
select * from v$memory_dynamic_components
在运行完一个具有代表性的工作负载之后,运行视图来快速查看数据库中memory_target分配的优化程度
select * from v$memory_target_advice
还可以查看过去800个已经完成的内存调整操作
select * from v$memory_resize_ops
pga命中率相关查询,尽量通过调整pga最小值可以让排序和散列都在内存完成,减少io提升运算速度
select * from v$pgastat select * from v$sgastat select * from v$sysstat
select * from v$sql_workarea_histogra
为oracle分配一部分查询缓存,存储sql查询结果以及plsql函数的结果,跟物化视图相比的话,物化视图是存储在磁盘上,这个结果缓存是保存在sga共享缓冲池,有利于频繁执行的,结果大的sql
RESULT_CACHE_MAXSIZE=500M /* 0-禁用服务器结果缓存 */ RESULT_CACHE_MAX_RESULT=20 RESULT_CACHE_REMOTE_EXPIRATION=3600
检查服务器缓存的状态
select dbms_result_cache.status() from dual; set serveroutput on; execute dbms_result_cache.memory_report; select * from v$result_cache_statstics;
对于单条查询和表使用缓存,force强制查询结果都缓存,manual仅在应用了提示或表设置之后才缓存,表设置在user_tables中有result_cache列
RESULT_CACHE_MODE /* 动态参数,FORCE: 强制所有sql查询结果都被数据库缓存起来, MANUAL: 数据库仅将使用查询提示或者表注释来启用缓存的特定查询结果进行缓存 * select /*+ RESULT_CACHE*/ **** * select /*+ NO_RESULT_CACHE*/ **** */ alter table stores RESULT_CACHE (MODE FORCE)
缓存结果在客户端,仅推荐只读或几乎只读的查询使用,客户端缓存是基于进程,所以多个客户端会话能共享一个缓存结果集,这些会话可以同时通过多个线程和多个语句来访问同一个结果集
CLIENT_RESULT_CACHE_SIZE /* 启用则设置一个大于32k的值,设为0关闭 */ CLIENT_RESULT_CACHE_LAG /* 缓存落后于真实值的时间 */