share_pool:用于缓存SQL语句以及SQL语句中涉及的表定义(数据列以及数据类型)
查看共享池
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL;
当执行一个sql语句,就会被记录,在生产平台上,很多sql语句会被很多人重复执行,所以,缓存了的sql语句,会被更快的执行
SQL> select count(*) from dba_objects;
SQL> select sql_text from v$sqlarea where sql_text like '%dba_objects%';
刷新(清空)share pool
SQL> alter system flush shared_pool;
再次查看之前的命令没有了
select sql_text from v$sqlarea where sql_text like '%dba_objects%';
SQL> show parameter shared_pool_size;
----------------------------------------------
Database buffer cache(作用:缓存数据)
Buffer cache存储从数据文件检索出来的数据块拷贝,提升数据检索速度,降低IO压力
SQL> create table aa as select * from dba_objects;
SQL> alter system flush shared_pool;
SQL> alter system flush buffer_cache;
打开自动跟踪
SQL> set autotrace traceonly;
SQL>select count(*) from aa;
结果:
5184 consistent gets (逻辑读 内存)
914 physical reads (物理读 硬盘)
再次执行
SQL> set autotrace traceonly;
SQL>select count(*) from aa;
结果:
5047 consistent gets(只有逻辑读 说明都是从内存读出的)
0 physical reads
-----------------------------
查看共享池
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL;
SQL> show parameter shared_pool_size;
SQL> alter system set shared_pool_size=64m scope=both;(此参数可以直接修改到内存和参数文件不需要重启)
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL;
SQL> show parameter shared_pool_size;
你会发现share pool有2个不同值
SQL> shutdown immediate;
SQL> startup
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL;
SQL> show parameter shared_pool_size;
重启后,依然不会变化,share pool有2个不同值,所以咱们不用修改,10g以后是段自动管理,除非你把段自动管理关闭,它才会生效。
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL;【以这个查询出的share pool为准】
不管share pool、buffer cache全是在SGA中划分出来的,share pool、buffer cache受SGA管理,你开启自动管理功能不用手工设置,受SGA控制。
SGA变大,share pool、buffer cache也会变大。SGA变小,share pool、buffer cache也会变小。
显示SGA的所有设置值
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL
union
select name as pool,sum(bytes/1024/1024) from v$sgastat s where s.POOL is null group by s.name;
SQL> show parameter sga;
SGA是动态的并且最大值由SGA_MAX_SIZE参数控制【sga中划分的所有池,相加总和不可以超过sga_target。如果想把SGA中划分的各个池调大,由于SGA自动管理,SGA变大,这些划分的各个池也会变大】
SQL> show parameter sga
SGA大小受2个参数影响:sga_target、sga_max_size
sga_max_size相当于你钱包里有多少钱,sga_target你要买的东西的价格
你钱包里有1000元,你买双500元的鞋。你钱包里有1000元,你买1500元的鞋,买不了吧!
在oracle运行过程当中修改SGA_TARGET值不能大于SGA_MAX_SIZE,生产中sga_target和sga_max_size大小致最好,就不会出问题了。
就是你有1000元钱,你买双1000元的鞋,正好~!
如果SGA_MAX_SIZE配置值小于SGA_TARGET,那么在数据库启动后SGA_MAX_SIZE= SGA_TARGET,在此期间SGA_TARGET不能向上调整
你谈个女朋友,你钱包里有1000元,人家要1500元的包,你是不是也得买啊?哪怕你是借钱
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL
union
select name as pool,sum(bytes/1024/1024) from v$sgastat s where s.POOL is null group by s.name;
SQL> show parameter sga
SQL> alter system set sga_max_size=350M scope=spfile;
SQL> shutdown immediate;
SQL> startup
SQL> show parameter sga 【如果SGA_MAX_SIZE配置值大于SGA_TARGET,那么在数据库启动后SGA_MAX_SIZE, SGA_TARGET分别使用自己的配置值】
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL
union
select name as pool,sum(bytes/1024/1024) from v$sgastat s where s.POOL is null group by s.name;
各个池没有变化,它们受sga_target影响,不受sga_max_size,上面咱们修改的是sga_max_size大小,所以各个池没有变化
SQL> alter system set sga_target=400M scope=spfile;
SQL> shutdown immediate;
SQL> startup
SQL> show parameter sga 【sga_max_size和sga_target一样了,sga_max_size迁就sga_target】
SQL> select pool,sum(bytes/1024/1024)from v$sgastat t where t.POOL is not null group by t.POOL
union
select name as pool,sum(bytes/1024/1024) from v$sgastat s where s.POOL is null group by s.name;
buffer cache和share pool有变化
生产中最简单的调优方式,扩大内存吧,所以服务器内存没有小于16G。
在oracle 10g后,SGA下的各个小池大小不需要咱们手工修改,你只需要会修改SGA,就可以了。
scope=spfile【修改参数文件,当前没有生效,要重启】
scope=both;【1修改到参数文件、2修改到内存当前生效】
memory_max_size
memory_target