数据库共享池
⑴ oracle 体系结构怎么样 去理解
1、 ORACLE 实例――包括内存结构与后台进程 2、 ORACLE 数据库――物理操作系统文件的集合 3、 了解内存结构的组成 4、 了解手橘升后台进程的作用
1、 Oracle 实例――包括内存结构与后台进程
2、 Oracle 数据库――物理操作系统文件的集合
3、 了解内存结构的组成
4、 了解后台进程的作用
5、 了解数据库的物理文件
6、 解释各种逻辑结构
一、Oracle实例
1、Oracle 实例
System Global Area(SGA) 和 Background Process 称为数据库的实例。
2、Oracle 数据库
一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)
3、系统全局共享区System Global Area(SGA)
System Global Area 是一块巨大的共享内存区域,他被看做是Oracle 数据库的一个大缓冲池,这里的数据可以被Oracle的各个进程共用。其大小可以通过如下语句查看:
sql> select * from v$sga;
NAME VALUE
-------------------- ---------
Fixed Size 39816
Variable Size 259812784
Database Buffers 1.049E+09
Redo Buffers 327680
更详细的信息可以参考V$sgastat、V$buffer_pool
主要包括以下几个部分:
a、 共享池(Shared pool)
共享池是SGA中最关键的内存片段,特别是在性能和可伸缩性上。一个太小的共享池会扼杀性能,使系统停止,太大的共享池也会有同样的效果,将会消耗大量的CPU来管理这个共享池。不正确的使用共享池只会带来灾难。共享池主要又可以分为以下两个部分:
SQL语句缓冲(Library Cache)
当一个用户提交一个SQL语句,Oracle会将这句SQL进行分析(parse),这个过程类似于编译,会耗费相对较多的时间。在分析完这个SQL,Oracle会把他的分析结果给保存在Shared pool的Library Cache中,当数据库第二次执行该SQL时,Oracle自动跳过这个分析过程,从而减少了系统运行的时间。这也是为什么第一次运行的SQL 比第二次运行的SQL要慢一点的原因。
下面举例说明parse的时间
SQL> select count(*) fromscpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.08
这是在Share_pool 和Data buffer 都没有数据缓冲区的情况下所用的时间
SQL> alter system flush SHARED_POOL;
System altered.
清空Share_pool,保留Data buffer
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.02
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.00
从两句SQL 的时间差上可以看出该SQL 的Parse 时间约为00:00:00.02
对于保存在共享池中的SQL语句,可以从V$Sqltext、v$Sqlarea中查询到,对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间。一个设计的差的应用程序可以毁掉整个数据库的Share pool,提高SQL语句的重用率必须先养成良好的变成习惯,尽量使用Bind变量。
数据字典缓冲区(Data Dictionary Cache)
显而易见,数据字典缓冲区是Oracle特地为数据字典准备的一块缓毕老冲池,供Oracle内部使用,没有什么可以说伍猜的。
b、块缓冲区高速缓存(Database Buffer Cache)
这些缓冲是对应所有数据文件中的一些被使用到的数据块。让他们能够在内存中进行操作。在这个级别里没有系统文件,,户数据文件,临时数据文件,回滚段文件之分。也就是任何文件的数据块都有可能被缓冲。数据库的任何修改都在该缓冲里完成,并由DBWR进程将修改后的数据写入磁盘。
这个缓冲区的块基本上在两个不同的列表中管理。一个是块的“脏”表(Dirty List),需要用数据库块的
书写器(DBWR)来写入,另外一个是不脏的块的列表(Free List),一般的情况下,是使用最近最少使用 (Least Recently Used,LRU)算法来管理。块缓冲区高速缓存又可以细分为以下三个部分(Default pool,Keep pool,Recycle pool)。如果不是人为设置初始化参数(Init.ora),Oracle将默认为Default pool。由于操作系统寻址能力的限制,不通过特殊设置,在32位的系统上,块缓冲区高速缓存最大可以达到1.7G,在64位系统上,块缓冲区高速缓存最大可以达到10G。
c、重做日志缓冲区(Redo log buffer)
重做日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句,如(Insert,Update,Delete),或DDL语句,如(Create,Alter,Drop等)。 重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小,大于3M之后的重作日志缓冲区已经没有太大的实际意义。
d、java程序缓冲区(Java Pool)
Java 的程序区,Oracle 8I 以后,Oracle 在内核中加入了对Java的支持。该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小。
e、大池(Large Pool)
大池的得名不是因为大,而是因为它用来分配大块的内存,处理比共享池更大的内存,在8.0开始引入。
下面对象使用大池:
MTS――在SGA的Large Pool中分配UGA
语句的并行查询(Parallel Executeion of Statements)――允许进程间消息缓冲区的分配,用来协调 并行查询服务器
备份(Backup)――用于RMAN磁盘I/O缓存
4、后台进程(Background process)
后台进程是Oracle的程序,用来管理数据库的读写,恢复和监视等工作。Server Process主要是通过他和user process进行联系和沟通,并由他和user process进行数据的交换。在Unix机器上,Oracle后台进程相对于操作系统进程,也就是说,一个Oracle后台进程将启动一个操作系统进程;在Windows机器上, Oracle后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个Oracle.EXE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。
在Unix上可以通过如下方法查看后台进程:
ps ?ef | grep ora_
# ps -ef | grep ora_ | grep XCLUAT
Oracle 29431 1 0 Sep 02 2:02 ora_dbwr_SID
Oracle 29444 1 0 Sep 02 0:03 ora_ckpt_SID
Oracle 29448 1 0 Sep 02 2:42 ora_smon_SID
Oracle 29442 1 0 Sep 02 3:25 ora_lgwr_SID
Oracle 29427 1 0 Sep 02 0:01 ora_pmon_SID
a、Oracle系统有5 个基本进程他们是
DBWR(数据文件写入进程)
LGWR(日志文件写入进程)
SMON(系统监护进程)
PMON(用户进程监护进程)
CKPT(检查点进程,同步数据文件, 日志文件,控制文件)
b、DBWR
将修改过的数据缓冲区的数据写入对应数据文件
维护系统内的空缓冲区
这里指出几个容易错误的概念:
当一个更新提交后,DBWR把数据写到磁盘并返回给用户提交完成.
DBWR会触发CKPT 后台进程
DBWR不会触发LGWR 进程
上面的概念都是错误的.
DBWR是一个很底层的工作进程,他批量的把缓冲区的数据写入磁盘。和任何前台用户的进程几乎没有什么关系,也不受他们的控制。至于DBWR会不会触发LGWR和CKPT进程,我们将在下面几节里讨论。
DBWR工作的主要条件如下
DBWR 超时
系统中没有多的空缓冲区用来存放数据
CKPT 进程触发DBWR 等
c、LGWR
将重做日志缓冲区的数据写入重做日志文件,LGWR是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志并记录在重做日志缓冲区内。这个重做日志可以类似的认为是以下的一个结构:
SCN=000000001000
数据块ID
对象ID=0801
数据行=02
修改后的数据=0011
提交的时候,LGWR必须将被修改的数据的重做日志缓冲区内数据写入日志数据文件,然后再通知前台进程提交成功,并由前台进程通知用户。从这点可以看出LGWR承担了维护系统数据完整性的任务。
LGWR 工作的主要条件如下
用户提交
有1/3 重做日志缓冲区未被写入磁盘
有大于1M 重做日志缓冲区未被写入磁盘
超时
DBWR需要写入的数据的SCN号大于LGWR 记录的SCN号,DBWR 触发LGWR写入
d、SMON
工作主要包含
清除临时空间
在系统启动时,完成系统实例恢复
聚结空闲空间
从不可用的文件中恢复事务的活动
OPS中失败节点的实例恢复
清除OBJ$表
缩减回滚段
使回滚段脱机
e、PMON
主要用于清除失效的用户进程,释放用户进程所用的资源。如PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源。
f、CKPT
同步数据文件,日志文件和控制文件,由于DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一至,这就需要CKPT进程来同步。CKPT会更新数据文件/控制文件的头信息。
CKPT工作的主要条件如下
在日志切换的时候
数据库用immediate ,transaction , normal 选项shutdown 数据库的时候
根据初始话文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的设置的数值来确定
用户触发
以下进程的启动需要手工配置
g、ARCH
当数据库以归档方式运行的时候,Oracle会启动ARCH进程,当重做日志文件被写满时,日志文件进行切换,旧的重做日志文件就被ARCH进程复制到一个/多个特定的目录/远程机器。这些被复制的重做日志文件被叫做归档日志文件。
h、RECO
负责解决分布事物中的故障。Oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。RECO进程试图建立与远程服务器的通信,当故障消除后,RECO进程自动解决所有悬而未决的会话。
i、服务进程Server Process
服务进程的分类
专用服务进程(Dedicated Server Process)
一个服务进程对应一个用户进程
共享服务进程(MultiTreaded Server Process)
一个服务进程对应多个用户进程,轮流为用户进程服务。
PGA & UGA
PGA = Process Global Area
UGA = User Global Area
他保存了用户的变量、权限、堆栈、排序空间等用户信息,对于专用服务器进程,UGA在PGA中分配。对于多线程进程,UGA在Large pool中分配。
j、用户进程User Process
在客户端,将用户的SQL 语句传递给服务进程
5、一个贯穿数据库全局的概念----系统改变号SCN(System Change Number)
系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
a. 查询语句不会使SCN增加,就算是同时发生的更新,数据库内部对应的SCN也是不同的。这样一来就保证了数据恢复时候的顺序。
b. 维持数据的一致性,当一
二、Oracle 数据库
Oracle数据库的组成――物理操作系统文件的集合。主要包括以下几种。
1、控制文件(参数文件init.ora记录了控制文件的位置)
控制文件包括如下主要信息
数据库的名字,检查点信息,数据库创建的时间戳
所有的数据文件,联机日志文件,归档日志文件信息
备份信息等
有了这些信息,Oracle就知道那些文件是数据文件,现在的重做日志文件是哪些,这些都是系统启动和运行的基本条件,所以他是Oracle运行的根本。如果没有控制文件系统是不可能启动的。控制文件是非常重要的,一般采用多个镜相复制来保护控制文件,或采用RAID来保护控制文件。控制文件的丢失,将使数据库的恢复变的很复杂。
控制文件信息可以从V$Controlfile中查询获得
2、数据文件(数据文件的详细信息记载在控制文件中)
可以通过如下方式查看数据文件
SQL> select name from v$datafile;
NAME
---------------------------------------------
/u05/dbf/PROD/system_01.dbf
/u06/dbf/PROD/temp_01.dbf
/u04/dbf/PROD/users_01.dbf
/u09/dbf/PROD/rbs_01.dbf
/u06/dbf/PROD/applsys_indx_01.dbf
/u05/dbf/PROD/applsys_data_01.dbf
从以上可以看出,数据文件大致可以分为以下几类:
i. 系统数据文件(system_01.dbf)
存放系统表和数据字典,一般不放用户的数据,但是用户脚本,如过程,函数,包等却是保存在数据字典中的。
名词解释:数据字典 数据字典是一些系统表或视图,他存放系统的信息,他包括数据库版本,数据文件信息,表与索引等段信息,系统的运行状态等各种和系统有关的信息和用户脚本信息。数据库管理员可以通过对数据字典的查询,就可以了解到Oracle的运行状态。
ii. 回滚段文件(rbs_01.dbf)
如果数据库进行对数据的修改,那么就必须使用回滚段,回滚段是用来临时存放修改前的数据(Before Image)。回滚段通常都放在一个单独的表空间上(回滚表空间),避免表空间碎片化,这个表空间包含的数据文件就是回滚数据文件。
iii. 临时数据文件(temp_01.dbf)
主要存放用户的排序等临时数据,与回滚段相似,临时段也容易引起表空间碎片化,而且没有办法在一个永久表空间上开辟临时段,所以就必须有一个临时表空间,它所包含的数据文件就是临时数据文件,主要用于不能在内存上进行的排序操作。我们必须为用户指定一个临时表空间。
iv. 用户数据文件(/applsys_data_01.dbf ,applsys_indx_01.dbf)
存放用户数据,这里列举了两类常见的用户型数据,一般数据和索引数据,一般来说,如果条件许可的话,可以考虑放在不同的磁盘上。
3、重做日志文件(联机重做日志)
用户对数据库进行的任何操作都会记录在重做日志文件。在了解重做日志之前必须了解重做日志的两个概念,重做日志组和重做日志组成员(Member),一个数据库中至少要有两个日志组文件,一组写完后再写另一组,即轮流写。每个日志组中至少有一个日志成员,一个日志组中的多个日志成员是镜相关系,有利于日志文件的保护,因为日志文件的损坏,特别是当前联机日志的损坏,对数据库的影响是巨大的。
联机日志组的交换过程叫做切换,需要特别注意的是,日志切换在一个优化效果不好的数据库中会引起临时的“挂起”。挂起大致有两种情况:
在归档情况下,需要归档的日志来不及归档,而联机日志又需要被重新利用
检查点事件还没有完成(日志切换引起检查点),而联机日志需要被重新利用
解决这种问题的常用手段是:
i.增加日志组
ii.增大日志文件成员大小
通过v$log可以查看日志组,v$logfile可以查看具体的成员文件。
4、归档日志文件
Oracle可以运行在两种模式之中,归档模式和不归档模式。如果不用归档模式,当然,你就不会有归档日志,但是,你的系统将不会是一个实用系统,特别是不能用于生产系统,因为你可能会丢失数据。但是在归档模式中,为了保存用户的所有修改,在重做日志文件切换后和被覆盖之间系统将他们另外保存成一组连续的文件系列,该文件系列就是归档日志文件。
有人或许会说,归档日志文件占领我大量的硬盘空间,其实,具体想一想,你是愿意浪费一点磁盘空间来保护你的数据,还是愿意丢失你的数据呢?显而义见,我们需要保证我们的数据的安全性。其实,归档并不是一直占领你的磁盘空间,你可以把她备份到磁带上,或则删除上一次完整备份前的所有日志文件。
5、初始化参数文件
initSID.ora或init.ora文件,因为版本的不一样,其位置也可能会不一样。在8i中,通常位于$Oracle_HOME/admin//Pfile下,初始化文件记载了许多数据库的启动参数,如内存,控制文件,进程数等,在数据库启动的时候加载(Nomount时加载),初始化文件记录了很多重要参数,对数据库的性能影响很大,如果不是很了解,不要轻易乱改写,否则会引起数据库性能下降。
6、其他文件
i . 密码文件
用于Oracle 的具有sysdba权限用户的认证.
ii. 日志文件
报警日志文件(alert.log或alrt.ora)
记录数据库启动,关闭和一些重要的出错信息。数据库管理员应该经常检查这个文件,并对出现的问题作出即使的反应。你可以通过以下SQL 找到他的路径select value from v$PARAMETER where name ="background_mp_dest";
后台或用户跟踪文件
系统进程或用户进程出错前写入的信息,一般不可能读懂,可以通过Oracle的TKPROF工具转化为可以读懂的格式。对于系统进程产生的跟踪文件与报警日志文件的路径一样,用户跟踪文件的路径,你可以通过以下SQL找到他的路径select value from v$PARAMETER where name ="user_mp_dest";
三、Oracle逻辑结构
1、 表空间(tablespace)
表空间是数据库中的基本逻辑结构,一系列数据文件的集合。一个表空间可以包含多个数据文件,但是一个数据文件只能属于一个表空间。
2、 段(Segment)
段是对象在数据库中占用的空间,虽然段和数据库对象是一一对应的,但段是从数据库存储的角度来看的。一个段只能属于一个表空间,当然一个表空间可以有多个段。
表空间和数据文件是物理存储上的一对多的关系,表空间和段是逻辑存储上的一对多的关系,段不直接和数据文件发生关系。一个段可以属于多个数据文件,关于段可以指定扩展到哪个数据文件上面。
段基本可以分为以下四种
数据段(Data Segment)
索引段(Index Segment)
回滚段(Rollback Segment)
临时段(Temporary Segment)
3、区间(Extent)
关于Extent的翻译有多种解释,有的译作扩展,有的译作盘区,我这里通常译为区间。在一个段中可以存在多个区间,区间是为数据一次性预留的一个较大的存储空间,直到那个区间被用满,数据库会继续申请一个新的预留存储空间,即新的区间,一直到段的最大区间数(Max Extent)或没有可用的磁盘空间可以申请。 在Oracle8i以上版本,理论上一个段可以无穷个区间,但是多个区间对Oracle却是有性能影响的,Oracle建议把数据分布在尽量少的区间上,以减少Oracle的管理与磁头的移动。
4、Oracle数据块(Block)
Oracle最基本的存储单位,他是OS数据块的整数倍。Oracle的操作都是以块为基本单位,一个区间可以包含多个块(如果区间大小不是块大小的整数倍,Oracle实际也扩展到块的整数倍)。
5、基本表空间介绍
a. 系统表空间
主要存放数据字典和内部系统表基表
查看数据数据字典的SQL
select * from dict
查看内部系统表的SQL
select * from v$fixed_view_definition
DBA对系统的系统表中的数据字典必须有一个很深刻的了解,他们必须准备一些基础的SQL语句,通过这些SQL可以立即了解系统的状况和数据库的状态,这些基本的SQL包括
系统的剩余空间
系统的SGA
状态系统的等待
用户的权限
当前的用户锁
缓冲区的使用状况等
在成为DBA 的道路上我们不建议你过分的依赖于OEM/Quest 等优秀的数据库管理工具,因为他们不利于你对数据数据字典的理解,SQL语句可以完成几乎全部的数据库管理工作。
大量的读少量的写是该表空间的一个显着的特点。
b. 临时表空间.
临时表空间顾名思义是用来存放临时数据的,例如排序操作的临时空间,他的空间会在下次系统启动的时候全部被释放。
c. 回滚段表空间
i. 回滚段在系统中的作用
当数据库进行更新插入删除等操作的时候,新的数据被更新到原来的数据文件,而旧的数据(Before Image)就被放到回滚段中,如果数据需要回滚,那么可以从回滚段将数据再复制到数据文件中。来完成数据的回滚。在系统恢复的时候, 回滚段可以用来回滚没有被commit 的数据,解决系统的一至性。
回滚段在什么情况下都是大量的写,一般是少量读,因此建议把回滚段单独出来放在一个单独的设备(如单独的磁盘或RAID),以减少磁盘的IO争用。
ii. 回滚段的工作方式
一个回滚表空间可以被划分成多个回滚段.
一个回滚段可以保存多个会话的数据.
回滚段是一个圆形的数据模型
假设回滚段由4 个区间组成,他们的使用顺序就是区间1à区间2à区间3à区间4à区间1。也就是说,区间是可以循环使用的,当区间4到区间1的时候,区间1里面的会话还没有结束, 区间4用完后就不能再用区间1,这时系统必须分配区间5,来继续为其他会话服务服务。
我们分析一个Update 语句的完成
①. 用户提交一个Update 语句
②. Server Process 检查内存缓冲.
如果没有该数据块的缓冲,则从磁盘读入
i. 如果没有内存的有效空间,DBWR被启动将未写入磁盘的脏缓冲写入磁盘
ii. 如果有有效空间,则读入
③. 在缓冲内更新数据
i. 申请一个回滚段入口,将旧数据写如回滚段
ii. 加锁并更新数据
iii. 并在同时将修改记录在Redo log buffer中
⑵ 影响数据库性能的主要因素有哪些
1、1、调整数据结构的设计。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。 x0dx0ax0dx0a2、2、调整应用程序结构设计。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。 x0dx0ax0dx0a3、3、调整数据库SQL语句。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。 x0dx0ax0dx0a4、4、调整服务器内存分销和段配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。 x0dx0ax0dx0a5、5、调整硬盘I/O,这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。 x0dx0ax0dx0a6、6、调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。 x0dx0ax0dx0a实际上,上述数据库优化措施之间是相互联系的。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。另外,良好的数据库管理工具对于优化数据库性能也是很重要的。 x0dx0ax0dx0aORACLE数据库性能优化工具 x0dx0ax0dx0a常用的数据库性能优化工具有: x0dx0ax0dx0a1、1、ORACLE数据库在线数据字典,ORACLE在线数据字典能够反映出ORACLE动态运行情况,对于调整数据库性能是很有帮助的。 x0dx0ax0dx0a2、2、操作系统工具,例如UNIX操作系统的vmstat,iostat等命令可以查看到系统系统级内存和硬盘I/O的使用情况,这些工具对于管理员弄清出系统瓶颈出现棚行在什么地方有时候很有用。 x0dx0ax0dx0a3、3、SQL语言跟踪工具(SQL TRACE FACILITY),SQL语言跟踪工具可以记录SQL语句的执行情况,管理员可以使用虚拟表来调整实例,使用SQL语句跟踪文件调整应用程序性能。SQL语言跟踪工具将结果输出成一个操作系统的文亏誉件,管理员可以使用TKPROF工具查看这些文件。 x0dx0ax0dx0a4、4、ORACLE Enterprise Manager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令。 x0dx0ax0dx0a5、5、EXPLAIN PLAN——SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言。 x0dx0ax0dx0aORACLE数据库的系统性能评估 x0dx0ax0dx0a信息系统的类型不同,需要关注的数据库参数也是不同的。数据库管理员需要根据自己的信息系统的类型着重考虑不同的数据库参数。 x0dx0ax0dx0a1、1、在线事务处理信息系统(OLTP),这种类型的信息系统一般需要有大量的Insert、Update操作,典型的系统包括民航机票发售系统、银行储蓄系统等。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的ORACLE数据库需要主要考虑下述参数: x0dx0ax0dx0al l 数据库回滚段是否足够? x0dx0ax0dx0al l 是否需要建立ORACLE数据库索引、聚集、散列? x0dx0ax0dx0al l 系统全局区(SGA)大小是否足够? x0dx0ax0dx0al l SQL语句是否高效? x0dx0ax0dx0a2、2、数据仓库系统(Data Warehousing),这种信息系统的主要任务是从ORACLE的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的ORACLE数据库着重考虑下述参数: x0dx0ax0dx0al l 是否采用B*-索引或者bitmap索引? x0dx0ax0dx0al l 是否采用并行SQL查询以提高查询效率? x0dx0ax0dx0al l 是否采用PL/SQL函数编写存储过程? x0dx0ax0dx0al l 有必要的话,需要建立并行数据库提高数据库的查询效率 x0dx0ax0dx0aSQL语句的调整原则 x0dx0ax0dx0aSQL语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效率是很不相同的。程序员可以使用EXPLAIN PLAN语句来比较各种实现方案,并选出最优的实现方案。总得来讲,程序员写SQL语句需要满足考虑如下规则: x0dx0ax0dx0a1、1、尽量使用索引。试比较下面两条SQL语句: x0dx0ax0dx0a语句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN x0dx0ax0dx0a(SELECT deptno FROM emp); x0dx0ax0dx0a语句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS x0dx0ax0dx0a(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno); x0dx0ax0dx0a这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高一些。 x0dx0ax0dx0a2、2、选择联合查询的联合次序。考虑下面的例子: x0dx0ax0dx0aSELECT stuff FROM taba a, tabb b, tabc c x0dx0ax0dx0aWHERE a.acol between :alow and :ahigh x0dx0ax0dx0aAND b.bcol between :blow and :bhigh x0dx0ax0dx0aAND c.ccol between :clow and :chigh x0dx0ax0dx0aAND a.key1 = b.key1 x0dx0ax0dx0aAMD a.key2 = c.key2; x0dx0ax0dx0a这个SQL例子中,程序员首先需要选择要查询的主表,因为主表要进行整个表数据的扫描,所以主表应该数据量最小,所以例子中表A的acol列的范围应该比表B和表C相应列的范围小。 x0dx0ax0dx0a3、3、在子查询中慎重使用IN或者NOT IN语句,使用where (NOT) exists的效果要好的多。 x0dx0ax0dx0a4、4、慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。 x0dx0ax0dx0a5、5、可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。 x0dx0ax0dx0a6、6、ORACLE公司提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存很多的存储过程“钉”到内存中有利于提高最终用户的响应时间。 x0dx0ax0dx0aCPU参数的调整 x0dx0ax0dx0aCPU是服务器的一项重要资源,服务器良好的工作状态是在工作高峰时CPU的使用率在90%以上。如果空闲时间CPU使用率就在90%以上,说明服务器缺乏CPU资源,如果工作高峰时CPU使用率仍然很低,说明服务器CPU资源还比较富余。 x0dx0ax0dx0a使用操作相同命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar _u命令查看CPU的使用率,NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。 x0dx0ax0dx0a数据库管理员可以通过查看v$sysstat数据字典中“CPU used by this session”统计项得知ORACLE数据库使用的CPU时间,查看“OS User level CPU time”统计项得知操作系统用户态下的CPU时间,查看“OS System call CPU time”统计项得知操作系统系统态下的CPU时间,操作系统总的CPU时间就是用户态和系统态时间之和,如果ORACLE数据库使用的CPU时间占操作系统总的CPU时间90%以上,说明服务器CPU基本上被ORACLE数据库使用着,这是合理,反之,说明服务器CPU被其它程序占用过多,ORACLE数据库无法得到更多的CPU时间。 x0dx0ax0dx0a数据库管理员还可以通过查看v$sesstat数据字典来获得当前连接ORACLE数据库各个会话占用的CPU时间,从而得知什么会话耗用服务器CPU比较多。 x0dx0ax0dx0a出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足。 x0dx0ax0dx0a1、数据库管理员可以执行下述语句来查看SQL语句的解析情况: x0dx0ax0dx0aSELECT * FROM V$SYSSTAT x0dx0ax0dx0aWHERE NAME IN x0dx0ax0dx0a('parse time cpu', 'parse time elapsed', 'parse count (hard)'); x0dx0ax0dx0a这里parse time cpu是系统服务时间,parse time elapsed是响应时间,用户等待时间 x0dx0ax0dx0awaite time = parse time elapsed _ parse time cpu x0dx0ax0dx0a由此可以得到用户SQL语句平均解析等待时间=waite time / parse count。这个平均等待时间应该接近于0,如果平均解析等待时间过长,数据库管理员可以通过下述语句 x0dx0ax0dx0aSELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA x0dx0ax0dx0aORDER BY PARSE_CALLS; x0dx0ax0dx0a来发现是什么SQL语句解析效率比较低。程序员可以优化这些语句,或者增加ORACLE参数SESSION_CACHED_CURSORS的值。 x0dx0ax0dx0a2、数据库管理员还可以通过下述语句: x0dx0ax0dx0aSELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA; x0dx0ax0dx0a查看低效率的SQL语句,优化这些语句也有助于提高CPU的利用率。 x0dx0ax0dx0a3、3、数据库管理员可以通过v$system_event数据字典中的“latch free”统计项查看ORACLE数据库的冲突情况,如果没有冲突的话,latch free查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。 x0dx0ax0dx0a内存参数的调整 x0dx0ax0dx0a内存参数的调整主要是指ORACLE数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 x0dx0ax0dx0a1、 1、 共享池由两部分构成:共享SQL区和数据字典缓冲区,共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。数据库管理员通过执行下述语句: x0dx0ax0dx0aselect (sum(pins - reloads)) / sum(pins) "Lib Cache" from v$librarycache; x0dx0ax0dx0a来查看共享SQL区的使用率。这个使用率应该在90%以上,否则需要增加共享池的大小。数据库管理员还可以执行下述语句: x0dx0ax0dx0aselect (sum(gets - getmisses - usage - fixed)) / sum(gets) "Row Cache" from v$rowcache; x0dx0ax0dx0a查看数据字典缓冲区的使用率,这个使用率也应该在90%以上,否则需要增加共享池的大小。 x0dx0ax0dx0a2、 2、 数据缓冲区。数据库管理员可以通过下述语句: x0dx0ax0dx0aSELECT name, value FROM v$sysstat WHERE name IN ('db block gets', 'consistent gets','physical reads'); x0dx0ax0dx0a来查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。 x0dx0ax0dx0a这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。 x0dx0ax0dx0a3、 3、 日志缓冲区。数据库管理员可以通过执行下述语句: x0dx0ax0dx0aselect name,value from v$sysstat where name in ('redo entries','redo log space requests');查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败率: x0dx0ax0dx0a申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。
⑶ sql在数据库共享池中能否共享
sql必须是同一个用户模埋执行的。sql在数据库共享池中能否共享的说法正如码悄确的是sql必须是同一个用户执行的,执行的sql所处的当时的数据库环境必须是一样的,同样的sql生成的HASH值一定是一样的。渣渣SGL是一个数组,该数组中的元素被称之为SGE,每一个SGE就是一个DataSegment(数据段)。
⑷ ORACLE 数据库缓冲区缓存与共享池SQL查询和PL/SQL函数结果缓存的区别
1、数团咐陵据库缓冲区DB_BUFFER只能缓存访问过的BLOCK,部分解决了物理读的问题,查询仍然需要大量的逻辑读。
2、SQL缓存结果集/*+RESULT_CACHE*/它缓存的是查询的结果。不在需要大量的逻辑读,不在需要任何的复杂计算,而是直接将已经缓存的结果返回。
3、对于采用了RESULT_CACHE的函数,Oracle自动将函数的返简胡回结果缓存,下次执行的时候,不会实际执行函数,而是直接返回结果。塌戚由于缓存的结果存储在SGA中,因此所有的会话可以共享这个结果。
⑸ SGA是什么
是一组包含一个Oracle实例的数据和控制信息的共享内存结构。主要是用于存储数据库信息的内存区,该信息为数据库进程所共享(PGA不能共享的)。它包含Oracle服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
SGA几个很重要的特性:
1、SGA的构成--数据和控制信息,我们下面会详细介绍;
2、SGA是共享的,即当有多个用户同时登录了这个实例,SGA中的信息可以被它们同时访问(当涉及到互斥的问题时,由latch和enquence控制);
3、一个SGA只服务于一个实例,也就是说,当一台机器上有多个实例运行时,每个实例都有一个自己的SGA尽管SGA来自于OS的共享内存区,但实例之间不能相互访问对方的SGA区。
它主要包括:
1.数据库高速缓存(the database buffer cache),
2.重演日志缓存(the redo log buffer)
3.共享池(the shared pool)
4.数据字典缓存(the data dictionary cache)以及其它各方面的信息。
1.数据高速缓冲区(Data Buffer Cache)
在数据高速缓冲区中存放着Oracle系统最近使用过的数据块(即用户的高速缓冲区),当把数据写入数据库时,它以数据块为单位进行读写,当数据高速缓冲区填满时,则系统自动去掉一些不常被用访问的数据。如果用户要查的数据不在数据高速缓冲区时,Oracle自动从磁盘中去读取。数据高速缓冲区包括三个类型的区:1) 脏的区(Dirty Buffers):包含有已经改变过并需要写回数据文件的数据块。
2) 自由区(Free Buffers):没有包含任何数据并可以再写入的区,Oracle可以从数据文件读数据块该区。
3) 保留区(Pinned Buffers):此区包含有正在处理的或者明确保留用作将来用的区。
2.Redo Log Buffer Cache缓存对于数据块的所有修改。
主要用于恢复其中的每一项修改记录都被称为redo 条目。利用Redo条目的信息可以重做修改。
3. Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义。
它主要由两个内存结构构成:Library cache和Data dictionary cache
修改共享池的大小:ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;
Libray Cache缓存最近被执行的SQL和PL/SQL的相关信息。实现常用语句的共享,使用LRU算法进行管理
,由以下两个结构构成:Shared SQL area、Shared PL/SQL area、Data Dictionary Cache、Data dictionary cache缓存最近被使用的数据库定义。它包括关于数据库文件、表、索引、列、用户、权限以及其它数据库对象的信息。在语法分析阶段,Server Process访问数据字典中的信息以解析对象名和对存取操作进行验证。数据字典信息缓存在内存中有助于缩短响应时间。
4.数据字典缓存(the data dictionary cache)
⑹ oracle数据库组成部分
ORACLE由两部分:实例和数据库
实例由以下组成: SGA,Shared pool,Database buffer cache,Redo log buffer cache.
数据库由物理文件组成,其中必须有的文件是:数据文件,控制文件,重做日志
另外还有:参数文件,口令文件,归档日志文件(这三个不是必须的)
ORACLE SERVER 由两个部分组成,
1.INSTANCE:又由内存结构和后台进程组成
2.DATABASE:又由数据文件,日志文件和控制文件组成<这三个文件是必需的>.
CONTROL FILE是用来连接实例和DATABASE的
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP NOMOUNT
SQL>ALTER DATABASE MOUNT
以上三个过程就是通过CONTROL FILE来连接实例和数据库.
SQL>ALTER DATABASE OPEN
在OPEN的过程对DATABASE的数据文件和重做日志文件进行一次性的验证,验证它们的状态.
ORACLE INSTANCE:存取数据库的一个手段
一个DATABASE与INSTANCE之间是1:N的关系,一个INSTANCE只能操作一个DATABASE,由内存结构(共享池,
BUFFER CACHE,REDO LOG BUFFER CACHE)及相应的进程结构组成(PMON<程序监控进程>,SMON<系统监控进
程>,CKPT<检查点进程>)
SQL>SHOW SGA ---显示DATABASE内存结构信息
SQL>SET WRAP OFF
SQL>SET LINESIZE 200
以上这两个是设置行宽
SQL>SELECT * FROM V$BGPROCESS;
将看到在这个系统中所有可能使用到的进程,其中PADDR并不每个进程都分配到有效的地址,即并不是每个进程都是必须的.
SQL>SELECT * FROM V$BGPROCESS WHERE PADDR<>\'00\'
将显示所有必需的进程.
ESTABLISHING A CONNECTION AND CREATING A SESSION
连接到ORACLE实例包括建立一个用户连接及创建会话.
ORACLE MEMORY STRUCTURE (内存结构)
由两部分组成:
1.SGA
SGA是动态的,其最大值由SGA_MAX_SIZE指定,SGA的内存由SGA COMPONENTS来动态调整.
2.PGA 是不共享的,即其包含的信息是不一样的,有两个可享的内存可以由SGA配置
<1> LARGE POOL
<2> JAVA POOL
SQL>SHOW PARAMETER SHARED
SQL>SHOW PARAMETER DB_CACHE
SQL>SHOW PARAMETER LOG
以上三个命令是用于查看相关内存信息
SQL>ALTER SYSTEM SET DB_CACHE_SIZE=20M;
所有内存大小总和不能大于SGA_MAX_SIZE的值,当提示信息出现?号或乱码时,是由于系统的语言问题.
可以通过ALTER SESSION SET NLS_LANGUAGE=\'AMERICAN\'或ALTER SESSION SET NLS_LANGUAGE=\"SIMPLE
[Page]
CHINESE\"
SHARED POOL (共享池)
含:<1>LIBRARY CACHE 库缓存
<2>DATA DICTIONARY CACHE 数据字典缓存,有的地方又称行CACHE,由SHARED_POOL_SIZE指定大小.
SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=64M;
LIBRARY CACHE 主要为提高代码的共享,存储的是最近使用的SQL和PL/SQL代码.
<1>.用最近最少使用(LRU)算法
<2>.包括两个结构 1:共享SQL代码 2:共享PL/SQL代码
<3>.不可直接定义,而由SHARED POOL SIZE决定.
DATA DICTONARY CACHE.
执行此命令的过程是:首先确认是否存在AUTHORS,,然后确认字段存不存在,再检查语法,最后验证权限,而
这些信息就属于DATA DICTIONARY CACHE的内容.其包含的信息有:DATABASE FILES,表,索引,字段,用户,
权限和其他数据库对象.
⑺ 数据库性能优化有哪些措施
1、调整数据结构的设计
这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。
2、调整应用程序结构设计
这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。
3、调整数据库SQL语句
应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。ORACLE公司推荐使用ORACLE语句优化器(OracleOptimizer)和行锁管理器(row-levelmanager)来调整优化SQL语句。
4、调整服务器内存分配
内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。
5、调整硬盘I/O
这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。
6、调整操作系统参数
例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。
实际上,上述数据库优化措施之间是相互联系的。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。另外,良好的数据库管理工具对于优化数据库性能也是很重要的。
一、ORACLE数据库性能优化工具
常用的数据库性能优化工具有:
ORACLE数据库在线数据字典,ORACLE在线数据字典能够反映出ORACLE动态运行情况,对于调整数据库性能是很有帮助的。
操作系统工具,例如UNIX操作系统的vmstat,iostat等命令可以查看到系统系统级内存和硬盘I/O的使用情况,这些工具对于管理员弄清出系统瓶颈出现在什么地方有时候很有用。
SQL语言跟踪工具(SQLTRACEFACILITY),SQL语言跟踪工具可以记录SQL语句的执行情况,管理员可以使用虚拟表来调整实例,使用SQL语句跟踪文件调整应用程序性能。SQL语言跟踪工具将结果输出成一个操作系统的文件,管理员可以使用TKPROF工具查看这些文件。
ORACLEEnterpriseManager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令。
EXPLAINPLAN——SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言。
二、ORACLE数据库的系统性能评估
信息系统的类型不同,需要关注的数据库参数也是不同的。数据库管理员需要根据自己的信息系统的类型着重考虑不同的数据库参数。
1、在线事务处理信息系统(OLTP),这种类型的信息系统一般需要有大量的Insert、Update操作,典型的系统包括民航机票发售系统、银行储蓄系统等。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的ORACLE数据库需要主要考虑下述参数:
数据库回滚段是否足够?
是否需要建立ORACLE数据库索引、聚集、散列?
系统全局区(SGA)大小是否足够?
SQL语句是否高效?
2、数据仓库系统(DataWarehousing),这种信息系统的主要任务是从ORACLE的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的ORACLE数据库着重考虑下述参数:
是否采用B*-索引或者bitmap索引?
是否采用并行SQL查询以提高查询效率?
是否采用PL/SQL函数编写存储过程?
有必要的话,需要建立并行数据库提高数据库的查询效率
三、SQL语句的调整原则
SQL语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效率是很不相同的。程序员可以使用EXPLAINPLAN语句来比较各种实现方案,并选出最优的实现方案。总得来讲,程序员写SQL语句需要满足考虑如下规则:
1、尽量使用索引。试比较下面两条SQL语句:
语句A:SELECTdname,
(SELECTdeptnoFROMemp);
语句B:SELECTdname,deptnoFROMdeptWHERENOTEXISTS
(SELECTdeptnoFROMempWHEREdept.deptno=emp.deptno);
这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高一些。
2、选择联合查询的联合次序。考虑下面的例子:
SELECTstuffFROMtabaa,tabbb,tabcc
WHEREa.acolbetween:alowand:ahigh
ANDb.bcolbetween:blowand:bhigh
ANDc.ccolbetween:clowand:chigh
ANDa.key1=b.key1
AMDa.key2=c.key2;
这个SQL例子中,程序员首先需要选择要查询的主表,因为主表要进行整个表数据的扫描,所以主表应该数据量最小,所以例子中表A的acol列的范围应该比表B和表C相应列的范围小。
3、在子查询中慎重使用IN或者NOTIN语句,使用where(NOT)exists的效果要好的多。
4、慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。
5、可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。
6、ORACLE公司提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存很多的存储过程“钉”到内存中有利于提高最终用户的响应时间。
四、CPU参数的调整
CPU是服务器的一项重要资源,服务器良好的工作状态是在工作高峰时CPU的使用率在90%以上。如果空闲时间CPU使用率就在90%以上,说明服务器缺乏CPU资源,如果工作高峰时CPU使用率仍然很低,说明服务器CPU资源还比较富余。
使用操作相同命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar_u命令查看CPU的使用率,NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。
数据库管理员可以通过查看v$sysstat数据字典中“CPUusedbythissession”统计项得知ORACLE数据库使用的CPU时间,查看“OSUserlevelCPUtime”统计项得知操作系统用户态下的CPU时间,查看“OSSystemcallCPUtime”统计项得知操作系统系统态下的CPU时间,操作系统总的CPU时间就是用户态和系统态时间之和,如果ORACLE数据库使用的CPU时间占操作系统总的CPU时间90%以上,说明服务器CPU基本上被ORACLE数据库使用着,这是合理,反之,说明服务器CPU被其它程序占用过多,ORACLE数据库无法得到更多的CPU时间。
数据库管理员还可以通过查看v$sesstat数据字典来获得当前连接ORACLE数据库各个会话占用的CPU时间,从而得知什么会话耗用服务器CPU比较多。
出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足。
1、数据库管理员可以执行下述语句来查看SQL语句的解析情况:
SELECT*FROMV$SYSSTATWHERENAMEIN
('parsetimecpu','parsetimeelapsed','parsecount(hard)');
这里parsetimecpu是系统服务时间,parsetimeelapsed是响应时间,用户等待时间,waitetime=parsetimeelapsed_parsetimecpu
由此可以得到用户SQL语句平均解析等待时间=waitetime/parsecount。这个平均等待时间应该接近于0,如果平均解析等待时间过长,数据库管理员可以通过下述语句
SELECTSQL_TEXT,PARSE_CALLS,EXECUTIONSFROMV$SQLAREA
ORDERBYPARSE_CALLS;
来发现是什么SQL语句解析效率比较低。程序员可以优化这些语句,或者增加ORACLE参数SESSION_CACHED_CURSORS的值。
2、数据库管理员还可以通过下述语句:
SELECTBUFFER_GETS,EXECUTIONS,SQL_TEXTFROMV$SQLAREA;
查看低效率的SQL语句,优化这些语句也有助于提高CPU的利用率。
3、数据库管理员可以通过v$system_event数据字典中的“latchfree”统计项查看ORACLE数据库的冲突情况,如果没有冲突的话,latchfree查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。
五、内存参数的调整
内存参数的调整主要是指ORACLE数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。
1、共享池由两部分构成:共享SQL区和数据字典缓冲区,共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。数据库管理员通过执行下述语句:
select(sum(pins-reloads))/sum(pins)"LibCache"fromv$librarycache;
来查看共享SQL区的使用率。这个使用率应该在90%以上,否则需要增加共享池的大小。数据库管理员还可以执行下述语句:
select(sum(gets-getmisses-usage-fixed))/sum(gets)"RowCache"fromv$rowcache;
查看数据字典缓冲区的使用率,这个使用率也应该在90%以上,否则需要增加共享池的大小。
2、数据缓冲区。数据库管理员可以通过下述语句:
SELECTname,valueFROMv$sysstatWHEREnameIN('dbblockgets','consistentgets','physicalreads');
来查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区的使用命中率=1-(physicalreads/(dbblockgets+consistentgets))。
这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。
3、日志缓冲区。数据库管理员可以通过执行下述语句:
selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests');
查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败率:
申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。
昆明北大青鸟java培训班转载自网络如有侵权请联系我们感谢您的关注谢谢支持
⑻ 近期数据库出现共享池锁等待(latch: shared pool)
解决共享池latch争用
避免unnecessary heaps
避免和伏野减少由缺弊喊于卜丛共享sql statements带来的碎片
避免_kghdsidx_count=1
避免flush shared pool
避免shared pool reserved free list碎片