优化Oracle库表设计的若干方法(3)

来源:asp之家 时间:2010-07-16 13:24:00 






2、显式为主键列建立反向键索引

2.1 反向键索引的原理和用途

  我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引。对于主键值是按顺序(递增或递减)加入的情况,默认的B-Tree索引并不理想。这是因为如果索引列的值具有严格顺序时,随着数据行的插入,索引树的层级增长很快。搜索索引发生的I/O读写次数和索引树的层级数成正比,也就是说,一棵具有5个层级的B-Tree索引,在最终读取到索引数据时最多可能发生多达5次I/O操作。因而,减少索引的层级数是索引性能调整的一个重要方法。

  如果索引列的数据以严格的有序的方式插入,那么B-Tree索引树将变成一棵不对称的"歪树",如图 5所示:


  而如果索引列的数据以随机值的方式插入,我们将得到一棵趋向对称的索引树,如图 6所示:


  比较图 5和图 6,在图 5中搜索到A块需要进行5次I/O操作,而图 6仅需要3次I/O操作。

  既然索引列数据从序列中获取,其有序性无法规避,但在建立索引时,Oracle允许对索引列的值进行反向,即预先对列值进行比特位的反向,如1000,10001,10011,10111,1100经过反向后的值将是0001,1001,1101,0011。显然经过位反向处理的有序数据变得比较随机了,这样所得到的索引树就比较对称,从而提高表的查询性能。

  但反向键索引也有它局限性:如果在WHERE语句中,需要对索引列的值进行范围性的搜索,如BETWEEN、<、>等,其反向键索引无法使用,此时,Oracle将执行全表扫描;只有对反向键索引列进行 <> 和 = 的比较操作时,其反向键索引才会得到使用。

  2.2 反向键索引的SQL语句

  回到我们上面的例子,由于T_ORDER和T_ORDER_ITEM的主键值来源于序列,主键值是有严格顺序的,所以我们应该摒弃默认的Oracle所提供的索引,而采取显式为主键指定一个反向键索引的方式。

  ORDER_ID为T_ORDER表的主键,主键名为PK_ORDER,我们为ORDER_ID列上建立一个反向键索引IDX_ORDER_ID,并使PK_ORDER_ID使用这个索引,其SQL语句如下:


  要保证创建IDX_ORDER_ID的SQL语句在创建PK_ORDER主键的SQL语句之前,因为主键需要引用到这个反向键索引。

  由于主键列的数据是唯一的,所以为IDX_ORDER_ID加上unique限定,使其成为唯一型的索引。

  2.3 PowerdDesigner如何操作

  1) 首先,需要为ORDER_ID列建立一个反向键索引。打开T_ORDER的Table Properties的窗口,切换到Indexes页,新建一个名为IDX_ORDER_ID的索引。填写完索引的名称后,双击这个索引,弹出Index Properties窗口,在这个窗口的Columns中选择ORDER_ID列。然后,切换到Options页,按图 7的方式将其设置为反向键索引。


  2) 显式指定主键PK_ORDER使用这个索引。在Table Properties窗口中切换到Keys页,默认情况下,PowerDesigner为T_ORDER所指定的主键名为Key1,我们将其更名为PK_ORDER,双击这个主键,弹出Key Properties窗口,切换到Options页,按图 8的方式为PK_ORDER指定IDX_ORDER_ID。


  不可否认PowerDesigner确实是目前业界最强大易用的数据库设计工具,但很遗憾,当我们为表主键指定一个索引时,其产生的语句在顺序上有问题:即创建主键的语句位于创建索引语句之前:


  我们可以通过对PowerDesigner生成SQL语句的设置进行调整,先生成创建表和索引的SQL语句,再创建为表添加主键和外键的SQL语句来达到曲线救国的目的,请看下一步。

  3)通过菜单Database->Generate Database...调出Database Configuration窗口,切换到Keys&Indexes页,按图 9设置:


  这里,我们将Primary Keys和Foreign keys的选项都取消,而将Indexes勾选,以达到只生成表的索引SQL语句的目的。

  点击"确定"后,生成创建数据库表及其索引的SQL语句,运行该SQL创建数据库后,再按图 10设置生成为表添加主键和外键的SQL语句:


  除此设置外,还必须切换到Tables & Views页下,取消所有选项,避免重新生成创建表的语句。

标签:数据库优化,oracle,表
0
投稿

猜你喜欢

  • 网页设计标准尺寸参考

    2007-12-29 20:42:00
  • 使用Python对微信好友进行数据分析

    2021-04-12 18:10:58
  • python集合用法实例分析

    2021-10-26 23:36:37
  • Python使用ConfigParser模块操作配置文件的方法

    2023-09-05 18:38:18
  • Python+ Flask实现Mock Server详情

    2021-02-11 19:56:28
  • python数据处理67个pandas函数总结看完就用

    2023-02-24 10:19:32
  • Python常用工具之音频调整音量

    2023-10-29 03:15:33
  • js实现通过开始结束控制的计时器

    2024-04-18 09:39:03
  • oracle快速删除重复的记录

    2010-07-23 13:03:00
  • 详解python 内存优化

    2022-06-04 16:31:43
  • JS版图片放大镜效果

    2024-04-30 08:50:57
  • 用Python制作在地图上模拟瘟疫扩散的Gif图

    2022-09-26 17:20:22
  • python如何使用opencv提取光流详解

    2023-06-19 19:02:19
  • JS实现页面滚动到关闭时的位置与不滚动效果

    2024-04-10 10:47:56
  • 通过Javascript将数据导出到外部Excel文档的函数代码

    2024-04-22 22:32:00
  • Python全栈之路正则函数

    2022-03-19 05:03:51
  • 教你精确编写高质量高性能的MySQL语法

    2009-01-14 12:57:00
  • Access 2002的三个实用技巧

    2007-10-22 12:22:00
  • asp 采集程序常用函数分析

    2011-03-16 11:03:00
  • 详解bootstrap导航栏.nav与.navbar区别

    2023-08-15 19:18:42
  • asp之家 网络编程 m.aspxhome.com