科技网

当前位置: 首页 >新闻

Oracle数据库的性能优化

新闻
来源: 作者: 2019-03-21 11:17:21

Oracle数据库在运行过程中会产生大量数据,消耗系统资源,增加系统开销,使数据库变得不易管理,输入/输出缓慢,性能大幅降低,甚至影响正常的生产,因此迫切需要对数据库进行优化。优化的目的是使数据库不仅能提供业务上的支撑,保证系统的平稳运行,还能为计费生产人员提供良好的应用环境,及时生成账务数据,同时使统计人员取得所需的计费数据为经营分析提供决策依据等。

1 优化系统架构,合理设计数据库

为保证系统的平稳运行,现在的Oracle数据库大多采用OPS(OracleParallelServer)技术,即设置两台数据库服务器,这两台服务器互为备份,当其中一台服务器故障时,另一台服务器自动接管其工作,从而保证服务器的单点故障不影响系统的运行。

自9i版本后,Oracle数据库引入了RAC(RealApplicationCluster)技术。与OPS技术相比,RAC做了大量改进,不仅双机性能和可靠性得到了大幅度提高,还引入了虚拟IP技术(即两台服务器各有一个IP地址,对外共用一个IP地址,即虚拟IP,外界访问数据库时使用虚拟IP,因此无论哪一台服务器为主用服务器,都不影响外界对数据库的访问,这样可以实现故障的无缝切换)。从电信计费系统

7×24h运行的要求来看,Oracle数据库应该采用RAC架构,以确保系统在出现单点故障时能够保证对外服务不间断。

电信计费系统从功能和运行特点上可以划分为如下两个部分。

(1)计费系统。它是一个批处理系统,主要负责采集用户的原始话单,并根据计费策略和规则进行账务结算,最后形成用户的缴费信息。计费系统的主要使用对象是计费人员,用户数少,数据库连接数一般在40~50个,数据量一般在TB级,磁盘的输入/输出数据量很高,但对响应时间要求不高。

(2)销账系统。主要负责缴费销账,面对的是前台营业员以及电信客户,用户数多,数据库连接数可以达到300以上,数据量一般在300GB左右,磁盘的输入/输出数据量相对计费系统要小很多,但对系统的响应时间要求很高(一般不能超过3s)。

由上可知,这两个系统对数据库的要求是不一样的。虽然可以采用让同一个数据库的不同实例分别运行计费和销账功能,但从实际运行情况来看并不理想:首先,数据库容量过大,不易管理;其次,计费系统在数据入库和计费出账时磁盘的输入/输出数据量过大,影响销账系统的运行,导致输入/输出的响应延迟,造成收费缓慢;最后,在这种架构下主机之间相互接管的可靠性大幅降低,对系统安全造成威胁。基于这些方面的考虑,应该将这两部分功能从数据库层面分离,形成两个数据库,分别处理这两个任务。

2 优化表空间,减少访问“热点”

Oracle数据库的数据存放在数据文件中,数据文件的逻辑管理形式是表空间,数据库在默认情况下对表空间的数据文件是依次使用的,这种使用方式会产生“热点”。所谓“热点”就是对少数数据文件访问频繁,而对其他数据文件访问极少。产生“热点”的原因是经常使用的数据不是分布在所有文件中,而是集中存放在少数文件中。“热点”的产生将造成被访问资源的竞争,影响访问效率。另外,Oracle数据库对同时访问的数据文件是有限制的,如果数据文件过小的数目太多,不仅不易管理,还会严重影响数据库的性能。

对于这种情况,可以采用以下三种方法进行优化。

(1)合理设计数据文件表空间的大小。首先统计每个表空间的大小,再根据容量设计数据文件的大小,尽量减少不同大小的数据文件的数目,使数据文件更易于管理。譬如可以把系统表空间System、Tools和User设计成大小一致,如果有10GB、20GB、100GB、200 GB的表空间,数据文件可以设计成10 GB和100 GB。

(2)利用操作系统的Strip(条带)功能减少“热点”。在生成数据文件时,可以利用操作系统的Strip功能将每个数据文件分布在所有磁盘上,这样即使频繁访问的数据位于一个数据文件中,数据也会分布在各个磁盘上,访问数据时可以尽量使各个磁盘的输入/输出保持均衡,减少磁盘的输入/输出瓶颈,从而减少“热点”产生的机率。

(3)利用跨操作系统的Strip功能减少“热点”。利用Oracle数据库自身的功能在数据库中建立表空间时,手工指定将数据分布在所有数据文件中,也能实现Strip功能,但它与操作系统无关,因而称为跨操作系统的Strip功能。

通过以上几个方法对表空间进行优化后,可以有效减少访问“热点”,尽量使各个磁盘的输入/输出均衡,达到优化数据库输入/输出性能的目的。

3 合理设置数据库参数,减少内存碎片

Oracle数据库的内存分为SGA(SharedGlobeArea,共享全局区域)和PGA(ProgramGlobe Area,程序全局区域)两部分。PGA由数据库自身管理,用户基本不用参与,只是监控PGA的使用情况,确保PGA没有溢出,因此数据库的内存优化主要是指SGA的优化。

SGA大致包括以下区域:FixedArea(固定区域)、VariableArea(可变区域)、DatabaseBlock Area(数据库块区域)、Log Buffer Area(日志缓冲区域)和Instance Lock Database(数据库实例锁)。

FixedArea每个组成部分的大小都是固定的,也就是说它们不能通过初始化参数的设置进行调整。

DatabaseBlockArea的大小由参数DB_CACHE_SIZE指定,对该区域的调整主要是根据应用环境调整keep池、循环池和默认池之间的比例。一般来说经常使用的参数表应该存放在keep池中。

LogBufferArea的大小由参数LOG_BUFFER指定,在不修改隐含参数的情况下其大小不应超过3MB,因为Oracle默认当Log Buffer Area改变1/3或者1 MB时就要写日志文件。

InstanceLockDatabase在OPS/RAC配置中,主要用于调控本地实例所要使用的数据库资源、所有实例和进程都会用到的数据库资源、所有实例和进程当前需要的或者已经拥有的锁,这三个部分的大小分别由参LM_RESS、LM_PROCS、LM_LOCKS参数指定,一般情况下不需要调整。

VariableArea由LargePool(大型池)和SharedPool(共享池)组成。Large Pool一般用于恢复管理备份,基本不用调整,因此需要调整的是Shared Pool。Shared Pool在SGA中占用了较大的一部分空间,主要用于存放最新使用的SQL语句的执行计划。Shared Pool的大小应合理设计,一般情况下认为内存越大越好,但在Oracle数据库中不是这样。Oracle数据库将Shared Pool分成若干Chunk(块),在每个Shared Pool Chunk(共享池块)被分配之后,Chunk的管理和分配都是在Shared Pool Latch(共享池锁)的保护下进行的。未分配的Free Chunk(空闲块)放在Free List(空闲块列表)中,在进行新的分配时,需要对Free List进行扫描,寻找足够大的Free Chunk存放SQL语句的执行计划,如果Shared Pool包含有大量的小的Free Chunk,则Free List的记录数就会很多,在对这个特殊的Free List进行扫描时,Shared Pool Latch将被长时间占用,也就是Shared Pool被锁住。当Shared Pool被锁住时,其他对Shared Pool的访问将等待,直至解锁。实际上经常出现的Shared Pool Latch的竞争和等待就是因为包含了大量小的Free Chunk,这些小的Free Chunk称为碎片,所以增加Shared Pool的大小并不能减少Shared Pool Latch Contention(共享池锁竞争),还会使竞争更加激烈。Shared Pool越大,产生的碎片可能越多,这就是将Shared Pool设很大但不一定会提高性能的原因。

从以上分析来看,优化SharedPool的关键在于减少碎片,以保证系统正常运行。碎片产生的原因除了由于SQL语句没有使用绑定变量外,数据库参数设置也是关键。在设置参数时应按照以下方式设置:数据库游标共享方式设置为“相似”,如果设置成“强制”,则应该先在测试环境进行完整测试后再使用。

减少碎片有两种方法。一种是用命令“AlterSystemFlushShared Pool”清空Shared Pool。清空Shared Pool可以减少Shared Pool Latch的竞争,降低产生ORA-4031(Oracle的一个错误代码,含义是Shared Pool的碎片过多,没有满足要求的可分配内存)错误的机率,还可以减少即刻的性能竞争(特别是那些被保存到Shared Pool中的主要对象)。在实际生产中,对数据库定期重启也是减少内存碎片的另一种有效方法。

内存碎片过多,将导致对数据库的访问经常不成功,造成业务的中断,对数据库的内存进行优化后,数据库的稳定性和效率可以得到大幅提高。

4 优化SQL语句,提高数据库响应速度

对于计费系统来说,SQL(StructureQueryLanguage,结构化查询语言)的优化是十分重要的。计费系统的SQL语句并不多,但是每个语句的重用度高,所访问的数据量非常巨大,很多SQL语句都是全表扫描,而且通常是多表之间的关联扫描。正因为如此,当SQL语句的执行计划发生变化时,整个系统响应就会变得缓慢。而计费系统的数据变化较大,CBO(CostBasic Optimize,基于代价的优化)方式很容易引起执行计划改变。以下两种办法可以解决执行计划变化带来的问题。

(1)使用提示,通过增加提示使Oracle采用正确的执行计划。不过这种方式与PowerBuilder会产生冲突,因此在PowerBuilder中不能直接采用这种办法。只有当直接用SQL语句进行数据转换时,这个方法非常有效。

(2)使用Oracle提供的outline工具将语句的执行计划固定下来。这种方法比使用提示更有效。

为提高SQL语句的响应速度,更快得到检索结果,还应对SQL语句本身进行优化。因为计费系统的数据表中存放的数据非常多,而SQL操作常常是对多表进行扫描,如果不对SQL语句进行优化,可能出现一条语句运行几天都不会有结果。在编写常用的SQL语句时注意以下几点可以提高SQL语句的运行效率:首先,尽可能减少同时对几个大表的全表扫描,如果确实需要同时多表扫描,应先在这些表的合适字段建立索引,在表关联时尽量用这些有索引的字段进行关联;其次,在写扫描条件时,检索速度快的条件写在前面,这样可以先过滤掉一些记录,再用速度慢的条件检索时,扫描的记录数将减少,可以相应提高扫描速度;最后,在使用索引字段时应尽量不要对该字段使用函数,因为使用函数后该字段的索引作用将消失。这些措施不仅可以提高SQL语句的响应速度,还能有效降低影响数据库性能的机率。

5 优化备份方式,确保数据安全

数据库备份是Oracle数据库维护工作的重要组成部分,目的是当数据库故障时能尽快恢复数据库,确保数据的完整和安全,因此备份优化的关键在于确保系统的备份恢复时限。目前情况下,在硬件上采取SAN(StorerageAreaNetwork,存储区域)备份方式可以大幅提高备份恢复速度,而采用0级和1级增量备份方式可以大幅降低数据库恢复时间。另外,采用只读表空间方式将计费历史查询数据和实时收费数据分离,可以在恢复管理备份和恢复时跳过相关数据,以加快备份和还原时间。

6 结束语

数据库的优化是一项长期的工作,现在很多电信系统的维护计划中都包含了数据库性能的定期巡检,也称健康检查。通过健康检查及时发现数据库潜在的安全隐患,作为调整数据库相应策略的依据,以确保数据库在任何时间都是以健康的状态运行。只有这样,才能保证实现电信业务7×24h不间断地为客户服务。

治疗渐冻症的药物
神经衰弱多吃什么水果
别墅设计图纸
中医治疗手足麻木

相关推荐