a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 322|回复: 1

[考试辅导] Oracle数据库中利用索引表提高查询速度

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
 在索引表的ROWID中存储的病不是记录的实际物理地址,而是逻辑的物理地址。故有些数据库管理员把索引表中的ROWID列称为ROWID伪主键列,他存放的是表的主键信息。" D  Y$ j9 Q5 n& s
  一、索引表与标准表的差异, q  n2 a+ K# b
  索引表与标准表的差异主要体现在四个方面。
: q+ P3 M) H( D& Q3 R& E& I: h  一是索引表中的ROWID列存放的时主键信息,使逻辑的物理地址。而在标准表的ROWID伪列中则存储的是真实的物理地址。这是两者之间最本质的区别。另外其他三个方面的差异都是因为有这个差异存在而存在。也可以说,他是索引表优势的根源。! Y) ^  H# k# W5 h% p4 D! `3 y
  二是索引表对记录的访问是基于主键的,也就是说,根据逻辑的ROWID.而标准表在访问记录的时候,则是通过物理的ROWID地址。
5 T1 K9 A0 }; l1 A0 E1 E  三是表的扫描方式不同。若采用索引表的话,则数据库是通过全索引扫描方式反问相关的记录;而若采用标准表的话,则是通过顺序扫描的方式返回相关的记录。这两者访问方式在性能上有很大的差异。全索引扫描方式,可能提供更高的查询性能。6 L! R$ I' s) p
  四是对于主键的要求不同。在建立标准表的时候,不一定要指定主键。但是,若用户在建立索引表的时候,则必须给表建立主键,使用主键来唯一表示一行记录。很简单,在索引表中,ROWID伪列中就存储着主键信息。若不指定具体的主键的话,数据访问时就不能够对记录进行定位。
0 y; y0 E2 e  A; A' G  不过,索引表与标准表的差异只是停留在数据库开发的层面,或者说,只是内部存储结构上有一定的差异。但是,在用户使用它们的时候,没有任何的差异。在前台应用程序设计的时候,用户可以向普通表那样访问索引表。这就给索引表的应用排除了使用上的障碍。0 g, J: q+ c) ]( e
  二、索引表的优势3 m9 O" w! x) g/ _3 D1 Q
  索引表的优势主要体现在数据查询上。而且,这个优势是非常明显的。
* u- |( e% K4 w& p/ D7 x. ?  一是索引表能够获得比标准表更快的查询速度,即使这张标准表已经建立了合适的索引。这跟索引表的存储结构是分不开的。因为索引表的数据在存储的时候,所有的行记录都是跟排序过的主键列一起存储在数据库系统中。故在查询的时候,只需要找到主键,就俄可以记录查询到整条记录的信息。而标准表在数据查询的时候,需要先找到对应的ROWID列,然后再去查询主键信息,再去查询对应的记录。所以,索引表减少了数据查询过程中的中间环节,避免了额外的数据块读取操作。- y, ?" c5 A" P3 B5 E1 C5 M
  二是索引表中的记录,是按照主键列进行排序存储的。对于主键列范围内的查询,用户可以获得更快的查询速度。这主要是因为在表格的ROWID伪列中,直接存储了主键信息。# a- v! f1 B7 `/ H. ~2 i' x9 h
  三是利用溢出存储功能,提高常用列的访问速度。在后台数据库表中,可能有几十个字段。但是,前台用户在查询的时候,往往不需要访问所有的字段。那些用户经常要访问的列,就叫做常用列。对常用列与不常用列区别明显的,可以通过溢出存储功能,提高常用列的访问速度。即将表中不经常需要访问的非主键列不存储在B树的叶子节点中,而是存储在一个具有堆组织方式的溢出存储区中。若索引表比较大,使用溢出存储不但可以减少索引表所占用的存储空间,而且可以提高常用列的查询效率。当然,这只是针对常用列而言。若用户查询非常用列时,溢出存储就没有效果了。0 s8 k& y% n4 S/ \8 c+ V
  三、索引表的使用时机
( X7 ]4 @8 g& w; r& q  1、 通过关键字查询表的内容。
5 c$ q+ F5 @9 G/ c) c4 n1 v7 f  如果在实际应用中,大部分是通过主键列来查询其他列的信息的时候,就可以考虑把这张表建立为索引表。
& b9 ?- j- v6 F& Z# r  如在ERP系统中,有销售订单表、采购订单表等等。对于这些表单,用户查询的时候,大部分是按照订单单号来进行查询。此时,数据库管理员在设计的时候,就可以把这些单据的基础表格设置为索引表。
* U/ h; p  Y9 l% @; v  特别是有些系统把单据分为单头档与单身档。如采购订单单头与采购订单单身。在前台显示为两个不同的页签,在后台对应两张不同的数据表。利用单头页签来调用单身的内容。此时,就是通过一个采购订单单头的ID列来查询单身的内容。在这种设计的时候,完全可以把订单单身对应的数据库表设置为“索引表”。从而提高数据查询的速度。# o4 A9 z) W/ O. ]$ x5 Y+ {
  2、 若表变化频繁,则不适宜使用索引表。
$ I& U0 u1 n0 k5 V& _. J3 G  若表的变更比较频繁的话,则采用索引表不怎么合适。这主要是因为Oracle数据库在对索引表管理时,开销比较大。如对于员工考勤系统中,员工信息这个表变更不是很频繁,但是,员工考勤信息表中的数据,则每个小时都可能会发生变化。
: B. q0 N! U1 g. e  H8 r+ E& j( D  对于变换这么频繁的表格,建立索引表就不怎么合适。此时,我们需要为其建立基本表,然后在基本表上建立索引。这虽然查询效果没有索引表那么好,但是,却可以大大减少Oracle数据库的开销。所谓,有得必有失。数据库管理员有时候还必须在这个得失之间寻求一个平衡。以期数据库整体性能的最优化。4 E+ B5 v: P7 a# m8 {
  3、 灵活利用溢出存储功能。
8 k0 ~+ K' W) K  普通B树索引条目一般比较小,因为在每个索引条目中仅保存索引列的值与ROWID的值。但是,因为索引表中的每个索引条目都包有整条地记录,所以,索引表中的索引条目就可能会很大。为此,用户若在索引表中查询数据,其查询的只是其中一部分字段内容的话,索引表的效果就体现不出来。相反,若表中的字段比较多的话,则效果会适得其反。为此,在Oracle数据库中,采用了溢出存储功能来应对索引表的这个缺陷。1 S. Y, a; m0 @7 W
  如在一张员工基本信息表中,他有员工姓名、员工编号、员工出身年月、身份证号码、住址、户口、民族等信息,长达几十个字段。但是,在平时的时候,我们基本上只需要查询员工的姓名、编号、身份证号码即可。而不需要其他的信息。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle数据库中利用索引表提高查询速度

  此时,当员工比较多的时候,就需要把这张表转换成索引表,然后采用溢出管理功能,来提高员工信息常用字段的查询速度。把用户经常需要用到的员工姓名、编号、身份证号码等字段保存在叶子节点上。而把其他不常用的字段采取“溢出存储”策略。
1 W! `  A0 o, C8 `  四、索引表的建立与使用
. n5 X" Q# `( c  在介绍索引表与基本表的差异时,笔者已经说过,两者的差异主要体现在存储结构上。故对于用户使用是没有多大影响的。
8 V$ C0 k% q# {+ Z5 x+ e1 I  在索引表的建立上,可以参考相关的书籍。笔者在这里只是要强调,在索引表建立过程中的几个关键点。1 V: A4 W# m# u$ k% c
  一是在索引表中,不能对非主键建立索引,。这是索引表建立的一个限制条件,数据库管理人员必须无条件的遵守。二是必须给索引表建立主键。有些数据库管理员有个习惯,在建立表的时候,一开始不设置主键。等到表维护的时候,再确定某个字段作为主键。但是,在索引表建立的时候,一开始就要指定表的主键,否则的话,会有错误产生。这也是数据库管理人员需要注意的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-3-28 20:57 , Processed in 0.222152 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表