查询用户进程等待重做日志缓存的次数。
l 共享池
2 共享池由初始化参数SHARED_POOL_SIZE指定,默认80MB,可以在运行期间手动修改该参数。
2 共享池中保存了最近执行的SQL语句、PL/SQL过程与包、数据字典信息、锁、以及其他控制结构的信息。共享池是对SQL语句、PL/SQL程序进行语法分析、编译、执行的内存区。共享池又分为两部分:
n 数据字典缓存
ü 数据字典缓存用于存储经常使用的数据字典信息。比如:表的定义、用户名、口令、权限、数据库的结构等。
ü Oracle运行过程中经常访问该缓存以便解析SQL语句,确定操作的对象是否存在,是否具有权限等。如果不在数据字典缓存中,服务器进程就从保存数据字典信息的数据文件中将其读入到数据字典缓存中。数据字典缓存中保存的是一条一条的记录(就像是内存中的数据库),而其他缓存区中保存的是数据块信息。
n 库缓存
ü 库缓存大小与OPEN_CURSOR初始化参数相关,ORACLE中每条查询语句都需要打开一个游标,OPEN_CURSOR默认值为300。
ü 库缓存的目的就是保存最近解析过的SQL语句、PL/SQL过程和包。这样一来,Oracle在执行一条SQL语句、一段PL/SQL 过程和包之前,首先在“库缓存”中搜索,如果查到它们已经解析过了,就利用“库缓存”中解析结果和执行计划来执行,而不必重新对它们进行解析,显著提高执行速度和工作效率。
2 Oracle长期运行后,共享池可能出现碎片,这时可以用以下语句清除共享池内的全部数据:alter system flush shared_pool;
2 实验与案例
n 验证数据块缓存和共享池的作用
1. 用sys登陆sqlplus,执行统计用户表空间个数的语句。
SQL>conn / as sysdba
SQL>set timing on
SQL>select count(*) from user_tablespaces;
由于是第一次执行该查询,需要将外存的user_tablespaces信息读入数据块缓存并对其进行解析,再把解析结果存储到共享池的库缓存中,所以用时较多。
2. 第二次执行该查询。由于不需要读外存,且sql语句执行计划在内存中,不需要硬解析,速度较快。
SQL>select count(*) from user_tablespaces;
3. 清空共享池,第三次执行。由于清除了共享池,需要重新解析sql语句,但所需数据还在数据库块缓存中,所以用时介于两者之间。
SQL>select count(*) from user_tablespaces;
n 缓存命中率
ü 逻辑读(LogicalReads):即从缓存中读取数据。
ü 物理读(PhysicalReads):即从物理磁盘上读取数据。
SQL>select statistic#, name, value from v$sysstat where name in ('physical reads', 'dbblock gets', 'consistent gets')
说明:v$sysstat是用来动态跟踪系统性能参数的数据字典表。查询和计算命中率有关的三个数据库行,分别是physical reads, db block gets, consistent gets。其中db block gets和 consistentgets的value值相加数据值为所有读的总次数。逻辑读次数为总和减去physical reads的value值。命中率为:逻辑读次数/所有读的总次数。
l 大池
2 由初始化参数LARGE_POOL_SIZE确定大小,可以使用ALTER SYSTEM语句来动态改变大池的大小。
2 大池是可选项的,DBA可以根据实际业务需要来决定是否在SGA区中创建大池。如果创建,将会自动的被各种各样的进程拿来使用,本来这些进程是使用共享池的内存。如果没有创建大池,则需要大量内存空间的操作将占用共享池的内存。
2 ORACLE 需要大力内存的操作有:
A、数据库备份和恢复。
B、具有大量排序操作的SQL语句。
C、并行化的数据库操作。
l JAVA池
2 由初始化参数JAVA_POOL_SIZE确定大小,控制在30-50MB比较合适。
2 用户存放JAVA代码、JAVA语句的语法分析表、JAVA语句的执行方案和进行JAVA程序开发。
2 可以使用ALTER SYSTEM SET JAVA_POOL_SIZE=0M SCOPE=SPFILE;调整其大小,语句在服务器初始化参数文件中修改该参数。必须重新启动数据库服务器才能使其生效。