Oracle数据库性能优化技术
每一个企业都应该有独立的IT战略, 这与今天企业的CEO/CFO所关注的目标是有很大关系的。对于CEO来说, 他最关心的是企业发展、业务布局、品牌影响力以及市场份额, 而对于CFO而言, 则是营收、利润以及成本。而对于那些已经建立起成熟体系的企业而言, 怎样才能不让成为整个企业发展的瓶颈甲骨文公司大中华区产品战略数据库增值软件总监冯葵认为其重点在于四个方面可用性、业务连续性、管理效率以及合法合规, 这些特点有效辅助了数据库产品, 成为数据库与应用之间的磨合剂。
今天没有一个事务、一个技术或者一个产品可以达到100%的可靠。它一定会在某个时候发生各种各样的问题。从产品和技术的角度来说, 这似乎无法根本解决, 但如果通过有效的架构, 这种可用性就可以真正实现。Oracle数据库企业版的内存数据库高速缓存选件是基于Oracle TimesTen内存数据库构建的, 它能够区分哪些信息是不太经常使用的, 哪些信息是经常使用的, 从而帮助你将“活” 的数据运行在高性能的存储设备上, 而不太使用的数据则可以运行在低速设备上或便宜的设备上。这有效突破了传统密集I/O的瓶颈, 不但可以有效地进行负载均衡,而且提供非常强大的性能,从而确保数据库里的信息能获得极高的可用性。
一、 oracle数据库及特点
oracle是一个功能极其强大的数据库系统。它起始于七十年代末的关系型数据库技术。这种类型数据库的关键是怎样理解数据间的关系,然后构造反映这些关系的信息库。oracle成功的将关系型数据库转移到桌面计算机上,提供了一个完整的客户/服务器体系结构的商用DBMs。同时它利用SQL*NET软件层,与多种操作系统支持通信协议相配合,为oracle关系型数据库提供分布式环境,可以实现单点更新,多点查询。Oracle数据库已经被用于各种大型信息系统中,特别是诸如银行,保险,烟草,石油等大数据量,对安全性要求较高的企业。其特点主要体现在:
1)支持大数据库、多用户的高性能事务处理Oracle支持最大数据库(几百TB),可充分利用硬件设备。支持大量用户同时在同一数据上执行各种应用,并使数据争用最小,保证数据的一致性。
2)硬件环境独立。Oracle具有良好的硬件环境独立性,支持各种类型的大型,中型,小型和微机系统。
3)遵守数据存取语言、操作系统、用户接口和网络通信协议的工业标准。
4)较好的安全性和完整控制。Oracle有用户鉴别、特权)、角色、触发器、日志、后备等功能,有效地保证了数据存取的安全性和完整性以及并发控制和数据的回复。
5)具有可移植性、可兼容性与可连接性oracle不仅可以在不同型号的机器上运行,而且可以在同一厂家的不同操作系统支持下运行。具有操作系统的独立性。
二、 数据库系统性能评价指标
主要从以下几个方面进行:
1)系统吞吐量。
吞吐量是指单位时间内数据库完成的SQL语句数目,以每秒钟的事务量(tps)表示。提高系统吞吐量可以通过减少服务时间在同样的资源环境下做更多的工作或通过减少总的响应时间使工作做得更快这两种方法来实现。
2)用户响应时间。
响应时间是指用户从提交SQL语句开始到获得结果集的第一行所需要的时间,是应用做出反应的时间,以毫秒或秒表示。响应时间可以分为系统服务时间(CPU时间)和用户等待时间两项。也就是说,要获得满意的用户响应时间有两个途径:一是减少系统服务时间,即提高数据库的吞吐量;二是减少用户等待时间,即减少用户访问同一数据库资源的冲突率。 #p#page_title#e#
3)数据库命中率。
Oracle用户进程所需的所有数据都是经过缓冲区高速缓存来存取的。用户对数据的需求能否在内存中得到满足,给出快速的响应,可用缓冲区高速缓存命中率来衡量。该比率等于高速缓存命中总数除以对高速缓存的查找总数。由于从高速缓存中读数据比从磁盘中读数据的开销要小得多,因此一般应使该命中率足够高。
4)内存使用情况。
内存的使用情况主要体现在可共享内存、永久性内存和运行时内存这三者的分配使用上。内存是否合理使用,一般考虑的主要调整目标有两条:使投资得到最大回报。把时间和精力用于解决可能产生最大利益的问题;使争用减到最小。瓶颈的特点在于延迟和等待,尽可能地消除或减少它。
5)磁盘I/O。
数据库中发生的每个动作几乎都将产生某种类型的I/O活动,该活动可以是逻辑的(在内存中),也可以是物理的(在磁盘上)。通过降低不必要的I/O开销可以增加用户任务可获得的吞吐量,缩短用户响应时间。其中,磁盘I/O操作是数据库性能最重要的方面,是计算机最大的开销。
三、 oracle数据库应用系统性能优化的主要方向
1) CPU利用
CPU是服务器的重要资源, 服务器良好的工作状态是在工作高峰时CPU的使用率在90%以上。在大型的应用系统中,比较流行的配置是oracle+unix,如IBM的小机,sun公司的red hat等。这些系统中使用sar-u命令查看CPU的使用率,Windows系列的操作系统的服务器,可以使用性能管理器来查看CPU的使用率。Oracle中:v$sysstat数据字典中“CPU used by this session”记录了数据库使用的CPU时间,“OS User level CPU time”统计了操作系统用户态下的CPU时间,“ OS System call CPU time”统计了操作系统系统态下的CPU时间,操作系统总的CPU时间就是用户态和系统态时间之和,如果Oracle数据库使用的CPU时间占操作系统总的CPU时间90%以上,说明服务器CPU基本上被Oracle数据库使用着,这是合理,反之,说明服务器CPU被其它程序占用过多,Oracle数据库无法得到更多的CPU时间。出现CPU资源不足的原因可能是SQL语句的重解析、低效率的SQL语句、锁冲突等。
2) 内存分配
内存参数的调整主要是指Oracle数据库的系统全局区SGA(System Global Area)的调整。SGA是Oracle数据库的心脏,是对数据库数据进行快速访问的一个系统区域,可以被服务器和用户共享。SGA主要由三部分构成:共享池(SharePool)、数据缓冲区(Data Buffers)、日志缓冲区(Redo Log Buffers)和PGA区域。SGA随着不同的环境而不同,没有一种通用的最佳方案,但在设置它之前要先考虑以下的几个方面:物理内存多大:操作系统是哪种以及占多大的内存,数据库系统是文件系统还是存储设备;数据库运行的模式。SGA占有物理内存的比例没有严格的规定,只能遵从一般的规则:SGA占据物理内存的40%~60%左右。如果通过直观的公式化来表达则为:OS使用内存+SGA+并发进程数×(Sort_
area_size+Hash_area_size+2M)<0.7RAM,以这个公式为参考进行自由调整即可。初始化参数文件中的一些参数对SGA的大小有决定性的影响。每个缓冲区的大小等于参数Db_block_size的大小。Oracle数据库块以字节表示大小。 #p#page_title#e#
四、 oracle数据库性能优化方法
1)建立索引
表格是关系型数据库的基础,数据库中的所有信息都是以表格的形式来存放的。由于Oracle 数据库是一个大型的数据库,存储着大量的数据信息。它使用一个内置的优化器来决定检索数据的最快方法。在Oracle 的性能优化中,适当的建立索引是很关键的。
(a) 低选中率的列建立位映射索引:为那些唯一度很低的列创建位映射索引, 位映射索引能够极大地帮助改善读性能。
(b) 为不平衡的B* 树索引创建反转关键字索引:反向键索引是一种B* 树索引。在这种索引方式中,关键字值的字节是按照相反的顺序存储的。
(c) 要建立合适的索引,还必须考察select 和where 子句,因为这是查询优化的首要焦点。当索引包括多列时,就构成了复合索引。
使用索引可以提高检索数据的效率, 但并不是说只要有索引,检索的效率就会提高,添加索引是以增大存储量和降低插入性能为代价的。这里存在着“百分之二十”的规则,当从表格中选取的行超过总行数的百分之二十时,表上的索引不会提高检索的速度,因此在创建索引时要考虑到这一点。不合适的索引将会导致查询性能的严重降低,应在SQL 语句中将这索引隐藏。
2)优化SQL语句
SQL 是一种非过程化语言, 它一次处理的是一个记录集合,对数据提供自动导航。SQL 允许用户在高层的数据结构上工作,而不是对单个记录进行操作。SQL 不要求用户指定对数据的存取方法,而是使用查询优化器,由系统决定对指定数据存取的最快速手段。当关系数据库的设计者在关系表上定义了索引之后,系统会自动地利用索引进行快速检索,用户不需知道表上是否有索引以及表有什么类型的索引等细节。在SQL 语句中,应注意以下几点:①在where 子句中,若使用and 条件,应将最有可能导致查询失败的条件放前面;若使用or 条件,应将最有可能致查询失败的条件放在后面;②进行多表查询时, 应将返回行少的表放在from 子句的后面,在where 子句中, 应将记录多的表的字段写在左边。值得注意的是,对那些写得不好的小SQL 语句进行优化更为重要,因为这些小的SQL 语句每天可能被访问成千上万次。
3)碎片问题
碎片是由于同一磁盘的各个部分分散在磁盘的不同区域产生的。在删除磁盘上的文件和添加新文件时会产生碎片。碎片的大量存在减慢了磁盘访问的速度,并降低了磁盘操作的综合性能。为了预防碎片,Oracle 提供两类表空间:①字典管理的表空间。在这种方式下,扩展管理是通过数据字典完成的。这是一种常规的和缺省的表空间类型;②本地管理的表空间,扩展管理是表空间自身完成。一旦选择了一个指定的类型,就不能更改。在OLTP 环境中,碎片是索引的祸根。Oracle 提供了两种方法来消除现存索引中的碎片:联机重建(Rebuild)和内置合并(Coalesce)。通过联机重建机制,索引可以完全地重建,这样就能恢复空间并且重新定位它。Rebuild 可以重新将一个索引定位到另一个表空间中。Coalesce 并不要求大量的磁盘空间,因为它在相同的索引内操作。它基本上是合并那些有相同分枝的叶节点。换句话说,它合并那些在过去分离的叶节点块。它释放叶节点块以备将来使用。
4)调整系统参数
每次在数据服务器上启动数据库系统时,就会在内存分配一个系统全局区(System Global Area),简称SGA。系统全局区用于存放系统信息,所有的用户进程和服务进程都可以访问这个内存结构。由于内存读取数据比磁盘读取要快得多,所以调整SGA 参数,可使Oracle 发挥最大效能。如果SGA 太小,就无法高效地完成Oracle 中的操作,如果SGA 太大,操作系统就可能没有足够的内存高效地完成计算机所必须的操作。在Init.ora 中通过调整DB_BLOCK_BUFFER 和LOG_BUFFER 的值,来改变SGA 的值。SGA 的值占整个内存的50%左右较为理想。在Oracle 数据库中有很多参数的设置是来定义物理存储、资源利用的,这些参数设置得是否合适也就与系统的效率直接有关,参数的调整实际上就是要调整资源的利用效率 #p#page_title#e#
在运行时, 导致程序失败的最常见的原因之一就是程序段的不可生长。这种不可生长可能是由于表空间中没有足够的空间来容纳段的生长, 也可能是到达了MAXEXTENTS。到达MAXEXTENTS 可能会造成大量的浪费,并且它不容易引起人们的注意, 操作者可以考虑将MAXEXTENTS 的值设置的尽可能大。从Oracle7 开始,MAXEXTENTS 对DB_BLOCK_SIZE 的依赖性就被取消,从而使得MAXEXTENTS 可以按照需要进行设置,甚至可以将它设置为UNLIMITED。如果使用的是MAXEXTENTS,Oracle 将自动地把MAXEXTENTS 设置为249000000。通过此设置, 就能够有效地阻止段由于到达扩展段的最大值而使应用程序因为不能接受更多数据而导致失败。
参考文献:
[1] Oracle数据库应用系统的性能优化 魏亚楠等 制造业自动化 2010
[2] Oracle数据库性能优化方法 李晓丽 软件导刊 2010
[3]数据库与应用之间的磨合剂—Oracle数据库增值软件谈 白苗 程序员2009