</p> 如果系统响应很慢,通过减少磁盘I/O就可以有一个很快的改善。如果在一个事务中通过按一定的范围搜索primary-key索引来访问表,那么重新以CTAS的方法组织表将是你减少I/O的首要策略。通过在物理上将行排序为和primary-key索引一样的顺序,就可以加快获得数据的速度。
1 N/ P$ W' d, Y- Z5 W 就象磁盘的负载平衡一样,行的重新排序也是很简单的,而且也很快。通过与其它的DBA管理技巧一起使用,就可以在高I/O的系统中大大地减少响应的时间。
- X% Q' r( E* H9 L1 Y 在高容量的在线事务处理环境中(online transaction processing,OLTP),数据是由一个primary索引得到的,重新排序表格的行就可以令连续块的顺序和它们的primary索引一样,这样就可以在索引驱动的表格查询中,减少物理I/O并且改善响应时间。这个技巧仅在应用选择多行的时候有用,或者在使用索引范围搜索和应用发出多个查询来得到连续的key时有效。对于随机的唯一primary-key(主键)的访问将不会由行重新排序中得到好处。
3 N* v9 i4 X- i8 v/ j$ A* @ 让我们看一下它是如何工作的。考虑以下的一个SQL的查询,它使用一个索引来得到100行:
% Z+ _ I2 f0 K" u0 R select& @2 D, E. j |# w2 P, h9 }. l) N
salary
) N, j5 M1 Z, Z/ | from
% T/ R6 [) T% i; C/ K, R7 ^/ g employee
4 v; D- g* H+ t/ `$ U/ B where/ {- l4 b9 i2 n: i' Z, N- s
last_name like 'B%';4 s: N: }1 H. h4 H" o
这个查询将会使用last_name_index,搜索其中的每一行来得到目标行。这个查询将会至少使用100次物理磁盘的读取,因为employee的行存放在不同的数据块中。! ]3 N& S$ z+ P/ V9 S7 [. W: z4 r
不过,如果表中的行已经重新排序为和last_name_index的一样,同样的查询又会怎样处理呢?我们可以看到这个查询只需要三次的磁盘I/O就读完全部100个员工的资料(一次用作索引的读取,两次用作数据块的读取),减少了97次的块读取。 y% v# G8 i! P) N! G
重新排序带来的性能改善的程度在于在你开始的时候行的乱序性如何,以及你需要由序列中访问多少行。至于一个表中的行与索引的排序键的匹配程度,可以查看数据字典中的dba_indexes和dba_tables视图得到。9 e! J/ a/ a+ @5 _
在dba_indexes的视图中,查看clustering_factor列。如果clustering_factor的值和表中的块数目大致一样,那么你的表和索引的顺序是一样的。不过,如果clustering_factor 的值接近表中的行数目,那就表明表格中的行和索引的顺序是不一样的。
! n: U1 N1 T1 t* q 行重新排序的作用是不可以小看的。在需要进行大范围的索引搜索的大表中,行重新排序可以令查询的性能提高三倍。
# q0 p3 O/ U5 D2 G3 t 一旦你已经决定重新排序表中的行,你可以使用以下的工具之一来重新组织表格。1 B, R8 E+ q: w* _
. 使用Oracle的Create Table As Select (CTAS) 语法来拷贝表格。
; z6 J& N% ]* c2 k . Oracle9i自带的表格重新组织工具。
4 W" L( y H! |# K
1 ?$ ^3 T1 K5 O' ~( ? 以下,我们来看以下SQL语句的调优。 |