探讨Oracle primary索引

数据库 Oracle
这里介绍如果在一个事务中通过按一定的范围搜索Oracle primary索引来访问表,那么重新以CTAS的方法组织表将是你减少I/O的首要策略。

经过长时间学习Oracle primary索引,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。有经验的Oracle DBA都知道I/O是响应时间的***组成部分。其中磁盘I/O特别厉害,因为当Oracle由磁盘上的一个数据文件得到一个数据块时,读的进程就必须等待物理I/O操作完成。磁盘操作要比数据缓冲慢10,000倍。因此,如果可以令I/O最小化,或者减少由于磁盘上的文件竞争而带来的瓶颈,就可以大大地改善Oracle数据库的性能。

如果系统响应很慢,通过减少磁盘I/O就可以有一个很快的改善。如果在一个事务中通过按一定的范围搜索Oracle primary索引来访问表,那么重新以CTAS的方法组织表将是你减少I/O的首要策略。通过在物理上将行排序为和Oracle primary索引一样的顺序,就可以加快获得数据的速度。

就象磁盘的负载平衡一样,行的重新排序也是很简单的,而且也很快。通过与其它的DBA管理技巧一起使用,就可以在高I/O的系统中大大地减少响应的时间。

在高容量的在线事务处理环境中(online transaction processing,OLTP),数据是由一个Oracle primary索引得到的,重新排序表格的行就可以令连续块的顺序和它们的Oracle primary索引一样,这样就可以在索引驱动的表格查询中,减少物理I/O并且改善响应时间。这个技巧仅在应用选择多行的时候有用,或者在使用索引范围搜索和应用发出多个查询来得到连续的key时有效。对于随机的唯一primary-key(主键)的访问将不会由行重新排序中得到好处。

让我们看一下它是如何工作的。考虑以下的一个SQL的查询,它使用一个索引来得到100行:

  1. selectsalaryfromemployeewherelast_name like 'B%'; 

这个查询将会使用last_name_index,搜索其中的每一行来得到目标行。这个查询将会至少使用100次物理磁盘的读取,因为employee的行存放在不同的数据块中。

不过,如果表中的行已经重新排序为和last_name_index的一样,同样的查询又会怎样处理呢?我们可以看到这个查询只需要三次的磁盘I/O就读完全部100个员工的资料(一次用作索引的读取,两次用作数据块的读取),减少了97次的块读取。

重新排序带来的性能改善的程度在于在你开始的时候行的乱序性如何,以及你需要由序列中访问多少行。至于一个表中的行与索引的排序键的匹配程度,可以查看数据字典中的dba_indexes和dba_tables视图得到。

在dba_indexes的视图中,查看clustering_factor列。如果clustering_factor的值和表中的块数目大致一样,那么你的表和索引的顺序是一样的。不过,如果clustering_factor的值接近表中的行数目,那就表明表格中的行和索引的顺序是不一样的。

行重新排序的作用是不可以小看的。在需要进行大范围的索引搜索的大表中,行重新排序可以令查询的性能提高三倍。

一旦你已经决定重新排序表中的行,你可以使用以下的工具之一来重新组织表格。
◆使用Oracle的Create Table As Select (CTAS)语法来拷贝表格
◆Oracle9i自带的表格重新组织工具

【编辑推荐】

  1. 简单谈谈Oracle SQL调优
  2. 深谈Oracle Freelist经验
  3. 简单接触一下Oracle扩展
  4. 浅谈Oracle Spatial几何结构
  5. 理论分析Oracle SQL语法
责任编辑:佚名 来源: 51cto.com
相关推荐

2009-11-20 17:17:08

Oracle函数索引

2021-01-28 05:13:17

Oracle索引外键

2009-11-19 11:28:50

Oracle利用Log

2009-11-20 13:51:14

Oracle Data

2009-11-18 09:39:06

Oracle介质恢复

2010-04-22 10:16:43

2010-04-16 16:41:53

rownum用法

2010-04-16 14:48:27

Oracle Spat

2009-11-18 16:33:31

Oracle Serv

2010-04-15 14:02:32

Oracle网络服务

2010-04-21 17:09:28

Oracle启动模式

2010-10-26 17:34:03

Oracle索引

2010-04-13 10:02:16

索引

2010-11-16 09:18:39

oracle重建索引

2009-11-11 09:13:11

Oracle索引扫描

2010-10-26 16:33:54

创建Oracle索引

2011-03-16 08:54:45

Oracle数据库索引

2009-11-19 15:32:50

Oracle索引

2010-11-16 10:21:25

Oracle创建表

2010-10-27 13:47:50

Oracle索引
点赞
收藏

51CTO技术栈公众号