用户提交一个新SQL语句时,Oracle会分析(parse)该句SQL(硬解析),这个过程将耗费相对较多的时间。分析完毕后,oracle会将该SQL的分析结果给保存在Library Cache中,当数据库再次执行该SQL时,oracle将直接取第一次分析结果而不再重新解析,从而减少运行时间。
Library Cache四个组成部分:
共享SQL区:保存语句文本,编译后的语法分析树及执行计划。
私有SQL区:保存语句中的变量值。
共享PL/SQL区:保存PL/SQL语句。
控制结构区:保存锁等控制信息。
查看library cache的大小:
SQL> select sum(sharable_mem) from v$db_object_cache;
测试library cache的作用:
SQL> set timing on
SQL> select count(*) from dba_objects;
COUNT(*)
----------
49809
Elapsed: 00:00:00.20
SQL> select count(*) from dba_objects;
COUNT(*)
----------
49809
Elapsed: 00:00:00.10
查看保存在library cache中保存的已分析的SQL语句:
SQL> select * from v$sqltext where sql_text like '%dba_object%';
SQL> select sql_text from v$sqlarea where sql_text like '%dba_object%';
绑定变量:
绑定变量的使用:
SQL> select object_id,object_name from dba_objects where object_id=5100;
SQL> select object_id,object_name from dba_objects where object_id=5101;
SQL> variable i number; #定义变量。
SQL> exec :i:=5100; #给变量赋值。
SQL> print :i #打印变量值。
SQL> select object_id,object_name from dba_objects where object_id=:i;
SQL> exec :i:=5101;
SQL> select object_id,object_name from dba_objects where object_id=:i;
SQL> select sql_text,parse_calls from v$sqlarea where sql_text like '%object_id%';
SQL_TEXT
--------------------------------------------------------------------------------
PARSE_CALLS
-----------
select object_id,object_name from dba_objects where object_id=:i #缓存的sql语句。
2 #被调用次数。
select sql_text,parse_calls from v$sqlarea where sql_text like '%object_id%'
1
select object_id,object_name from dba_objects where object_id=5100
1
select object_id,object_name from dba_objects where object_id=5101
1
#可见使用绑定变量可以增加sql语句缓存的命中率,减少硬解析所带来的性能损失。
Data Dictionary Cache
专供数据字典使用的缓冲区,SQL语句分析过程中需要大量访问系统数据字典(从磁盘数据文件中访问数据字典成为recursive calls),即可使用该缓存区专门存放数据字典,从而避免过多的recursive calls所带来的性能损失。
数据字典是关于数据库的参考信息、数据库的结构信息、数据库的用户信息等各类信息描述的一组表和视图的集合。
数据字典用于描述所有数据库对象的数据库对象的集合。
SQL> select * from v$fixed_table; #查看系统中所有的动态表。
SQL> select * from dict; #查看数据字典。
SQL> select object_name,object_type,created from dba_objects where object_name in ('TEST','T1'); #从数据字典的dba_objects表中查询指定数据库对象的相关描述。
SQL> select * from dba_users; #从数据字典dba_users表中查询数据库用户的相关描述。
SQL> select * from dba_data_files; #从数据字典dba_data_files表中查询所有数据库文件的相关描述。
数据字典中表的分类:
静态表:对各类数据库对象的各类属性的描述,常见的有下面三类字母开头:
dba_*:存储当前数据库中所有数据库对象的描述
all_*:存储当前用户能够访问的数据对象的描述
user_*:存储当前用户所拥有的数据库对象的描述
动态表:不断动态更新以反映数据库当前运行状况,常见以“v$”开头。
查看data dictionary cache的大小:
SQL> select sum(sharable_mem) from v$sqlarea;
测试的data dictionary cache作用:
SQL> set autot on stat #打开统计信息显示。
SQL> select count(*) from dba_source; #查询一张表。
COUNT(*)
----------
292167
Statistics
----------------------------------------------------------
312 recursive calls #recursive calls 次数。 0 db block gets
1998 consistent gets
698 physical reads
0 redo size
413 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
6 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select count(*) from dba_source; #再次查同一张表。
COUNT(*)
----------
292167
Statistics
----------------------------------------------------------
0 recursive calls #可见recursive calls 次数明显减少。
0 db block gets
1927 consistent gets
0 physical reads
0 redo size
413 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
3、Large pool
large_pool用来分配大内存块,来处理比shared pool更大的内存,实际常用做备用池,用以缓解oracle对共享池和PGA区内存的使用压力。使用large pool的对象主要有:
多线程服务器MTS:在SGA的large_pool中分配UGA;
语句的并行查询Parallel Exection:用作进程间的消息缓冲器;
恢复管理器RMAN:备份时用作磁盘I/O缓冲区。
SQL> show parameter large_pool #查看large_pool参数默认值,为0则应表示ASMM已开启。
SQL> select pool,sum(bytes) from v$sgastat group by pool; # 查看large_pool当前运行期间ASMM实际分配大小。
4、Java pool
oracle在内核中加入了对java的支持。该缓冲区转为java开发和应用所设,若不用java程序则没必要改变该缓冲区的默认大小。
SQL> show parameter java_pool #查看java_pool参数默认值,为0则应表示ASMM已开启。
SQL> select pool,sum(bytes) from v$sgastat group by pool; # 查看java_pool当前运行期间ASMM实际分配大小。
5、redo_log_buffer
对数据库的任何修改都按顺序被记录在该缓冲区,然后由LGWR进程根据条件将更改信息批量写入磁盘上的redo log文件,以节省磁盘IO。该缓存不参与ASMM的动态管理,不能自动调整大小。
SQL> select name,bytes from v$sgastat where name='log_buffer'; #查看log_buffer实际大小。
SQL> show parameter log_buffer #查看log_buffer预设大小。
SQL> alter system set log_buffer=2000000 scope=spfile; #手工修改log_buffer大小,需重启。
6、streams_buffer
用于对流复制进行缓冲。
SQL> show parameter streams_pool #查看streams_pool参数默认值。