当前位置: 首页 > 图文教程 > 数据库 > Oracle > Oracle数据库段管理有技巧

Oracle
常见的一些Oracle初学者的问题
ORACLE认证系统概述
数据库考试简介:Oracle认证
Oracle认证基础知识介绍
ADO连接Oracle Access示例及记录集处理源码
SQL Server和MySQL的安全性分析
用Oracle和SQL Server数据库组合利弊分析
Oracle 11g分区功能新革命
Flashback Query 恢复误删除的数据
基于Oracle高性能动态SQL程序开发
怎样在Oracle 9i中正确的转换时区
Oracle 10g导出的数据库能否导入Oracle 9i?
增加Distinct后查询效率反而提高
Oracle限制返回结果集的大小
Java语言数据库操作的基本流程
美国甲骨文(ORACLE)公司入驻渝中区大都会商厦
RHEL AS4上安装oracle 10R2 的方法
DB中如何查询Table占用空间的大小
编写高质量高性能的MySQL语法
Oracle数据库自动备份的具体实现步骤

Oracle数据库段管理有技巧


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 203 ::
收藏到网摘: n/a

在 Oracle数据库中,段往往被用来存储特定逻辑对象的所有数据。如当建立数据库表或者索引时,Oracle就会为这些对象分配存储空间,以存放他们所需要的信息。听过孙鑫老师的一些讲座,从中也讲到了oracle的一些小技巧,段是由一个或者多个区组成的。不要看段是Oracle数据库中一个不起眼的角色,其实,在其中,仍然隐藏着许多不为人知的管理技巧。若数据库管理员能够掌握这些内容,或许,其工作会变得轻松许多。

  技巧一:对大表执行分区段。

  表分区段用于存储分区表中某个分区的数据。如把某一个表分为几个区,每个区就对应一个表分区段。这么设置是可行的。因为根据段管理规则,在一个表空间上可以包含一个或者多个段,但是,一个段只能够存放在一个表空间上。

  在实际工作中,我们经常会碰到这种情况。如在一个大型零售企业的信息化管理系统中,一张销售表的年数据总量可能会达到几亿条,其数据总容量可能会有近十个G。如果平均分配到每个季度的话,则就有2.5G。此时,如果不对这张销售表进行分区分段管理的话,则这一年的销售记录都会存储在一张表中。此时,如果需要做年度分析的话,那么数据库的性能将会受到很大的影响。如现在用户想知道六、七月份空调的销量变化情况,此时数据库就需要扫描整个数据表中近10G的纪录。这需要用户等待比较长的时间。

  但是,此时若数据库管理员在数据库设计的时候,就能够预计到这种情况,对销售表进行分区分段管理。即把这张销售表分区段管理,也就是说,把销售表分为四个分区段,每个季度一个区段。如此的话,若要统计六、七月份的空调销售情况,则只需要查询5G的数据即可,其数据查询量将近减少了一半。显然,在实际工作中,如果对大表进行分区段管理,则可以大大降低I/O次数,并有效提高数据库查询性能。若销售量大的话,甚至可以把销售表分为十二个区段,一个月对应一个区段。

  所以,通过使用分区选项,采用表区段管理大表,可以将一张大表的数据部署到多个不同的分区段中。通过这种管理方式,可以降低I/O(输入输出)读取次数,最终提高I/O性能。这是数据库优化专家在提高数据库性能时,经常用到的一种手段。特别是在零售行业的信息化管理系统中,经常被用到。

  技巧二:合理利用索引组织表段。

  在Oracle数据库中,跟索引相关的表段主要有三个,分别为索引段、索引分区段与索引组织表段。

  索引段主要用来存储索引数据。当数据库管理员建立索引时,数据库系统就会自动为索引建立相应的索引段,其名字跟索引的名称相同。在对索引段进行管理时,有一个基本的原则,即一个索引段只能够存放在一个表空间中。

  索引分区段主要用来存储分区索引某个分区的数据。他跟笔者上面所说的表分区段类似。每个分区对应一个索引分区段。通过使用分区选项可以将大索引的数据部署到几个不同的分区段中,从而达到降低输入输出次数、提高数据库性能的目的。不过其在管理中,比表分区段多了一个限制条件,即索引分区只能够建立在分区表上,而不能够建立在普通表上。其他的管理跟分区表段类似,就不再重复阐述了。

  索引组织表是以B数结构来组织表数据的,其对应的段就是索引组织表段。其管理方式跟索引段类似。当数据库管理员建立索引时,就会自动创建这个段,用来保存相关的数据。

  现在摆在数据库管理员面前,就有一个难题。在什么时候用索引段,什么时候用索引组织表段,又在什么时候采用索引分区段呢?为此,笔者给出一个建议,供大家参考。

  通常情况下,如果表中的数据经常需要引用主键列莱检索的话,则可以考虑建立索引组织表,即通过索引组织段来管理。因为如果建立索引组织表段,则表和表主键索引的数据会存放在索引段中。从而提高查询的速度。而在普通表中,表与索引数据分别存放在表段与索引段中。这就是两者最本质的区别。另外需要提醒的是,如果数据库管理员建立索引组织表时,数据库开发人员必须要定义主键列。否则的话,就会以失败告终。

  而如果索引比较大的话,则可以将大索引的数据部署道几个不同的分去段中,这可以有效提高数据库的性能。

技巧三:减少临时段的使用。

  临时段主要用来存储排序等操作所产生的临时数据。如现在某张数据表中,有A、C、 B、F、E、D等记录。此时,若用Order By子句对其进行排序,数据库系统就会返回A、B、C、D、E、F数据。这些被重新排序过的数据,就叫做临时数据。通常情况下,这些临时数据会存放在两个地方,分别为PGA工作区与临时段中。默认情况下,这些临时数据会先存储在PAG工作区。如果因为临时数据比较大,PGA工作区已经满了的情况下,数据库会把剩下的临时数据存放到临时段中。

  从理论上讲,无论是把数据存放在PGA工作区还是存储在临时段中,对于用户的最终结果没有影响。但是,如果从数据库性能方面考虑,则两者就有比较大的差异。

  PGA工作区,又叫做程序全局区域,它是包含服务器进程的数据和控制信息的非共享内存区域。通常情况下,只要数据库服务器进程启动,则Oracle就会在内存中创建程序全局区域。在10G以后的版本中,Oracle数据库能够自动根据内存的使用情况来管理程序全局区域,而不用数据库管理员去手工的干预,从而使得PGA工作区的使用率更高。所以,一般来说,把临时数据存放在PGA工作区,其效率更高。

  在实际工作中,数据库管理员应该尽量避免产生大量的临时数据,或者说,尽量不让临时数据超过PGA工作区所能够承受的最大容量。从而数据库不得不把临时数据存放到临时段中。

  在实际工作中,很多Select语句都会产生临时数据。如在Select语句中,若加入Order By、Group By等子句,都会导致数据库对数据文件中的记录进行重新组织,从而产生大量的临时数据。为此,在应用程序设计中,就最好能够加入一些默认的查询限制条件,从而避免产生大量的临时数据。如在销售表查询的时候,如果用户没有输入具体的查询条件,则应用程序默认只查询近30天的销售记录,并按交易的日期或者产品进行排序。如果这些记录不能够满足用户的需求,再进行全部记录的查询。如此设计的话,就可以在一定程度上减少临时数据,减少临时段使用的频率。因为根据相关统计,用户在查询的时候,往往不会主动加入查询条件。而他们所需要的数据,往往都是最近一些的交易记录。为此,在应用程序设计过程中,加入一些默认的查询条件是非常有必要的。

  技巧四:LOB段最好独立与普通表。

  在Oracle数据库中,除了可以存放一些字符、数字等基本数据类型外,还可以存储附件、图像、音频、视频文件等等。用来存放这些数据的段,就叫做LOB段。当数据库在创建这些特殊类型的列时,Oracle数据库系统就会自动为他们建立对应的LOB段。通常情况下,如果这些特殊数据类型的长度比4000字节要少,则这一列与其他普通列的数据会一起存放在表段中,如果数据长度超过了 4000字节,则数据库就会被存放在LOB段中。

  如果从数据库性能方面考虑,最好能够把这些特殊的数据类型跟其他数据类型分别存放。如现在有一张产品信息表,需要包含产品ID、产品名称、产品规格、产品图像等内容。那么,在数据库设计的时候,最好能够建立两张表,一张用来存储产品 ID、产品名称、产品规格等信息;另一张表中存储产品ID、产品图像等信息。如此设计,主要是出于两个方面的考虑。

  一是在实际工作中,并不是每次查看产品信息时,都需要产品图像的内容。如在生成订单时,没有必要再每次下单时都显示产品图片。因为对于一些老产品来说,这个产品图像早就印在用户脑海中。即使系统显示图片信息,用户也不会去关注。

  二是这会影响数据库的查询性能。众所周知,数据库查询效率跟数据容量有很大的关系。数据容量越大,其查询的效率越低。而LOB段中存储的数据往往都是一些大容量的数据。所以在用户不需要的情况下,显示图像等信息,就会大大降低数据库的性能。再说,在一些应用程序中,由于网速或者刷新率等原因,其显示图像信息本身就要比显示文字信息来的慢。这就更加延长了用户的等待时间。

  所以,LOB段的数据类型最好能够跟表中的其他字段分开来管理。在数据库设计的时候,就可以把他们存放在独立的表中,然后通过关键字进行关联。