a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 58|回复: 0

[综合] Oracle认证辅导:数据库中如何利用索引表提高查询速度

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
在索引表的ROWID中存储的病不是记实的现实物理地址,而是逻辑的物理地址。故有些数据库打点员把索引表中的ROWID列称为ROWID伪主键列,他存放的是表的主键信息。
1 |$ h0 Y! q3 `  一、索引表与尺度表的差异
6 X0 L" t0 O7 Z7 V# d, ^  索引表与尺度表的差异首要表此刻四个方面。
5 |" K* k  F' S! t5 \  一是索引表中的ROWID列存放的时主键信息,使逻辑的物理地址。而在尺度表的ROWID伪列中则存储的是真实的物理地址。这是两者之间最素质的区别。此外其他三个方面的差异都是因为有这个差异存在而存在。也可以说,他是索引表优势的根源。
# r4 ~8 @% B6 k6 J8 G  二是索引表对记实的访谒是基于主键的,也就是说,按照逻辑的ROWID.而尺度表在访谒记实的时辰,则是经由过程物理的ROWID地址。5 _" R, t. n5 v9 p% t
  三是表的扫描体例分歧。若采用索引表的话,则数据库是经由过程全索引扫描体例反问相关的记实;而若采用尺度表的话,则是经由过程挨次扫描的体例返回相关的记实。这两者访谒体例在机能上有很年夜的差异。全索引扫描体例,可能供给更高的发芽机能。
3 g# P- r+ ^& j  四是对于主键的要求分歧。在成立尺度表的时辰,不必然要指定主键。可是,若用户在成立索引表的时辰,则必需给表成立主键,使用主键来独一暗示一行记实。很简单,在索引表中,ROWID伪列中就存储着主键信息。若不指定具体的主键的话,数据访谒时就不能够对记实进行定位。
, q& T2 {$ Z+ F# S, [+ u  不外,索引表与尺度表的差异只是勾留在数据库开发的层面,或者说,只是内部存储结构上有必然的差异。可是,在用户使用它们的时辰,没有任何的差异。在前台应用轨范设计的时辰,用户可以向通俗表那样访谒索引表。这就给索引表的应用解除了使用上的障碍。; u$ M- y: m, r5 e
  二、索引表的优势! d/ D: O: ~7 G& T( V' C1 z" e
  索引表的优势首要表此刻数据发芽上。而且,这个优势长短常较着的。
9 T' ]8 a) e3 q  一是索引表能够获得比尺度表更快的发芽速度,即使这张尺度表已经成立了合适的索引。这跟索引表的存储结构是分不开的。因为索引表的数据在存储的时辰,所有的行记实都是跟排序过的主键列一路存储在数据库系统中。故在发芽的时辰,只需要找到主键,就俄可以记实发芽到整标识表记标帜录的信息。而尺度表在数据发芽的时辰,需要先找到对应的ROWID列,然后再去发芽主键信息,再去发芽对应的记实。所以,索引表削减了数据发芽过程中的中心环节,避免了额外的数据块篡夺操作。
  t" _; G9 u* y" d0 X  二是索引表中的记实,是按照主键列进行排序存储的。对于主键列规模内的发芽,用户可以获得更快的发芽速度。这主若是因为在表格的ROWID伪列中,直接存储了主键信息。
; ?0 u: l* X) x$ F' C  三是操作溢出存储功能,提高常用列的访谒速度。在后台数据库表中,可能有几十个字段。可是,前台用户在发芽的时辰,往往不需要访谒所有的字段。那些用户经常要访谒的列,就叫做常用列。对常用列与不常用列区别较着的,可以经由过程溢出存储功能,提高常用列的访谒速度。即将表中不经常需要访谒的非主键列不存储在B树的叶子节点中,而是存储在一个具有堆组织体例的溢出存储区中。若索引表斗劲年夜,使用溢出存储不单可以削减索引表所占用的存储空间,而且可以提高常用列的发芽效率。当然,这只是针对常用列而言。若用户发芽很是用列时,溢出存储就没有用不美观了。
5 R1 j. P5 N; h5 y  三、索引表的使用机缘
1 t, k9 c3 E1 k2 l0 X  1、 经由过程关头字发芽表的内容。
* e6 ?, q( p" A6 F- {  如不美观在现实应用中,年夜部门是经由过程主键列来发芽其他列的信息的时辰,就可以考虑把这张表成立为索引表。: q8 E9 P' ^! T
  如在ERP系统中,有发卖订单表、采购订单表等等。对于这些表单,用户发芽的时辰,年夜部门是按照订单单号来进行发芽。此时,数据库打点员在设计的时辰,就可以把这些单据的基本表格设置为索引表。
3 f0 s: p' p0 ~  @2 p  出格是有些系统把单据分为单头档与独身档。如采购订单单头与采购订零丁身。在前台显示为两个分歧的页签,在后台对应两张分歧的数据表。操作单头页签来挪用独身的内容。此时,就是经由过程一个采购订单单头的ID列来发芽独身的内容。在这种设计的时辰,完全可以把订零丁身对应的数据库表设置为“索引表”。年夜而提高数据发芽的速度。6 _. `4 f! A! `3 M; v2 ?" Q
  2、 若表转变频仍,则不适宜使用索引表。$ F( Q* v$ b3 v8 L0 Z! E
  若表的变换斗劲频仍的话,则采用索引表不怎么合适。这主若是因为Oracle数据库在对索引表打点时,开销斗劲年夜。如对于员工考勤系统中,员工信息这个表变换不是很频仍,可是,提醒员工考勤信息表中的数据,则每个小时都可能会发生转变。
- j  M: \1 w# u; t  对于变换这么频仍的表格,成立索引表就不怎么合适。此时,我们需要为其成立根基表,然后在根基表上成立索引。这虽然发芽效不美观没有索引表那么好,可是,却可以年夜年夜削减Oracle数据库的开销。所谓,有得必有失踪。数据库打点员有时辰还必需在这个得失踪之间追求一个平衡。以期数据库整体机能的最优化。# U0 e$ L% |7 I8 p0 @$ p
  3、 矫捷操作溢出存储功能。
9 V) R: w: q8 l' H2 q2 d  通俗B树索引条目一般斗劲小,因为在每个索引条目中仅保留索引列的值与ROWID的值。可是,因为索引表中的每个索引条目都包有整条地记实,所以,索引表中的索引条目就可能会很年夜。为此,用户若在索引表中发芽数据,其发芽的只是其一一部门字段内容的话,索引表的效不美观就浮现不出来。相反,若表中的字段斗劲多的话,则效不美观会适得其反。为此,在Oracle数据库中,采用了溢出存储功能滥暌功对索引表的这个缺陷。
7 g$ y* |% j0 h  如在一张员工根基信息表中,他有员工姓名、员工编号、员工身世年月、身份证号码、住址、户口、平易近族等信息,长达几十个字段。可是,在日常平常的时辰,我们根基上只需要发芽员工的姓名、编号、身份证号码即可。而不需要其他的信息。
) D& E/ y% \" O* r  此时,当员工斗劲多的时辰,就需要把这张表转换成索引表,然后采用溢出打点功能,来提高员工信息常用字段的发芽速度。把用户经常需要用到的员工姓名、编号、身份证号码等字段保留在叶子节点上。而把其他不常用的字段采纳“溢出存储”策略。
( S! l. g1 w5 e; s0 J2 D& Z  四、索引表的成立与使用
) I3 E6 O3 r7 ]) L# r  在介绍索引表与根基表的差异时,笔者已经说过,两者的差异首要表此刻存储结构上。故对于用户使用是没有多年夜影响的。
+ c5 B% n& T4 N( G9 y( @  在索引表的成立上,可以参考相关的书籍。笔者在这里只是要强调,在索引表成立过程中的几个关头点。) [4 e3 P7 `  F6 ?4 ?
  一是在索引表中,不能对非主键成立索引,。这是索引表成立的一个限制前提,数据库打点人员必需无前提的遵守。二是必需给索引表成立主键。有些数据库打点员有个习惯,在成立表的时辰,一路头不设置主键。等到表维护的时辰,再确定某个字段作为主键。可是,在索引表成立的时辰,一路头就要指定表的主键,否则的话,会有错误发生。这也是数据库打点人员需要注重的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 11:52 , Processed in 0.220151 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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