APP下载

基于Oracle 11g表性能优化初探

2013-08-14李学国沈应兰

河南科技 2013年14期
关键词:语句数据库性能

李学国 沈应兰

(重庆科创职业学院,重庆 402160)

一 引言

Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的C/S或B/S体系结构的数据库之一。Oracle数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能。组成Oracle数据库的物理结构用来存储、管理、保护以及读取数据,在创建数据库时,对数据文件初始布局以及表空间的管理类型对性能都有较大的影响。实际项目中使用的Oracle数据库经过一段时间的运行,在线保存的数据量和业务处理的数据量在逐渐增大,最初的Oracle设置,与现在实际需要的运行性能有一定差距,需要进行一些优化调整。

二 创建最优性能的数据库

合理地配置并创建数据库有助于保证数据库的优良性能,并且数据库大小会随着使用时间成倍增长,因此创建最优性能的数据库一般具有以下几个原则:

1.强制数据库中创建的每一个表空间都必须是本地管理的。本地管理表空间能比已经被弃用的字典管理技术提供更好的性能。

2.确保数据库为每个用户自动分配一个默认的永久表空间。这可以保证在创建用户时,自动分配一个默认的表空间,而不是SYSTEM系统表空间。你不能让用户总是将对象建在SYSTEM表空间中,因为这样会对性能和可用性产生负面影响。

3.确保数据库会为每个用户自动分配一个默认的临时表空间。这可以保证在创建用户时,自动分配一个临时表空间,而不是SYSTEM表空间。你不能总是让用户使用SYSTEM表空间作为排序操作运算的临时表空间,因为这样会对性能和可用性产生负面影响。

如创建以下数据库:

创建数据库时,还需要考虑影响可维护性的功能。容易维护的数据库能正常运行更长时间,而这也正是总体性能的一个重要部分。“解决方案”部分的CREATE DATABASE语句同时还考虑了下面这些可维护性方面的特性。(1)创建一个自动的UNDO表空间。这使Oracle可以自动管理回滚段,你也就不必定期进行监控和微调了。(2)按照环境中的一定标准,将数据文件放到相应文件夹中。这有助于维护和管理,从而使数据库具备更好的长期可用性,从而获得更好的性能。

三 高效移除表中数据

在对数据库进行操作时,如果需要在移除数据以后还能选择进行数据回滚(而不是立即提交),那么就应该使用Delete语句。但是,Delete语句的缺点是它会产生大量的撤销(undo)和重做信息。因此,对于大表来说,Truncate语句通常是移除数据最有效的方法。

Truncate语句的另一个特性就是它会将表的高水位线重新归零。当你使用Delete语句移除表中数据时,高水位线将不会发生变化。使用Truncate语句并重置高水位线的一个优点就是,全表扫描查询仅搜索位于高水位线之下的存储块中的数据行。这对于进行全表扫描的查询性能具有很大的影响。

如:使用Truncate语句移除COMPUTER_SYSTEMS表中的所有数据

Truncate语句的另一个副作用就是,如果一张表定义了主键,并且这个主键是其子表的外键,那么不能截断该表,即使这个子表包含零个数据行也是如此。在这种场景下,试图截断父表时,Oracle将会抛出下面这个错误:

Oracle之所以会阻止你截断父表,是因为在一个多用户系统中,有可能在截断子表与接下来截断父表之间的这段时间里,另一个会话向子表中填充数据行。在这种情况下,必须暂时禁用子表所引用的外键约束,执行Truncate语句,然后再重新启用约束。

比较Truncate语句和Delete语句的功能。Oracle的确允许使用Delete语句从父表中移除数据行,而不管是否有指向子表的约束存在(假设子表中的数据为零行)。这是因为Delete会生成重做,具有读一致性,并且能够回滚。表1-1总结了Delete和TruncateE之间的区别。

表1 -1 Delete和Truncate比较

如果需要使用Delete语句,就必须使用COMMIT或ROLLBACK来结束事务。提交一条Delete语句就使得数据永久消失:

如果提交一条ROLLBACK语句而不是COMMIT,那么表中的数据将会与执行Delete语句之前一样。

使用DML语句时,可以查询V$TRANSACTION视图来确认事务的细节。例如,假设你往表中插入了数据,在进行COMMIT或ROLLBACK之前,能够看到当前所连接会话的活动事务信息如下所示:

四 重建跨多个数据块的数据行

当有一张表,其中的数据行可能会存储在多个数据块中。这种情况会增加I/O使用率,并导致对这张表的查询运行速度变慢。因此需要重建跨多个数据块的数据行,使每一行数据位于一个数据块中,从而提高表的性能。但是从表中取出数据时,可能会受到行链接的影响,因此必须删除表中的行链接。

解决行链接问题的一个办法就是使用MOVE语句。移动一张表时,Oracle需要表上的排它锁。因此当要进行移动操作的表没有活动事务时,应该执行MOVE操作。同时,作为移动操作的一部分,所有数据行都会被分配一个新的行编号(ROWID)。这会使表的所有索引失效。因此作为移动操作的一部分,你需要重建所有与进行移动的表相关的索引。如移动EMP表:

在数据块中保留有一定量的空间,以便容纳数据行的增长。通常数据行大小增加是由于执行了增加列长度值的UPDATE语句。如果块中没有足够的空间来容纳所增长的数据,那么Oracle就会创建一个指针,指向具有足够空间的数据块,并在该数据块中存储一部分行数据。当一个数据行存储在两个或多个数据块中时,就称为行链接。这可能会导致潜在的性能问题,因为Oracle将不得不从多个数据块(而不是一个)中取链接的一行数据。

少量的行链接不会对性能有很大的影响。一个大致的准则是,如果表中超过15%的数据行是链接的,那么你就要执行正确的操作了(例如移动表以重新进行组织)。

数据块中所保留的空闲存储空间大小由表的存储参数PCTFREE决定。PCTFREE的默认值为10,也就是数据块保留10%的空间,以备更新操作使用。如果某张表中的列初始插入空值(null),更新之后包含较大的值,那么就要考虑将PCTFREE设置为更高的值,例如40%。这将有助于阻止行链接的产生。

相反,如果你有一张表,在插入数据行之后就再也不会更新,那么可以考虑将PCTFREE值设置为0。这可以使每个数据块中容纳更多的行,从而减少取出数据时需要读取的磁盘空间数量(也就提高了性能)。

[1]陈雍.基于ORACLE数据库应用系统性能调整和优化研究[学位论文],江西师范大学,2008

[2]Vaidyanatha.G.K等.Oracle性能优化技术内幕.北京:机械工业出版社,2002.5

[3]萨师萱,王珊.数据库系统概论.北京:高等教学育出版社,2006

猜你喜欢

语句数据库性能
重点:语句衔接
提供将近80 Gbps的带宽性能 DisplayPort 2.0正式发布
数据库
数据库
数据库
数据库
Al-Se双元置换的基于LGPS的thio-LISICON的制备与性能表征
强韧化PBT/PC共混物的制备与性能
RDX/POLY(BAMO-AMMO)基发射药的热分解与燃烧性能
如何搞定语句衔接题