![]() 图 1 订单主从表 |
| /*订单表*/ create table T_ORDER ( ORDER_ID NUMBER(10) not null, ADDRESS VARCHAR2(100), CLIENT VARCHAR2(60), ORDER_DATE CHAR(8), IS_SHIPPED CHAR(1), constraint PK_T_ORDER primary key (ORDER_ID) ); create index IDX_CLIENT on T_ORDER ( CLIENT ASC, ORDER_DATE ASC, IS_SHIPPED ASC); /*订单条目子表*/ create table T_ORDER_ITEM ( ITEM_ID NUMBER(10) not null, ORDER_ID NUMBER(10), ITEM VARCHAR2(20), COUNT NUMBER(10), constraint PK_T_ORDER_ITEM primary key (ITEM_ID) ); create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM ( ORDER_ID ASC); alter table T_ORDER_ITEM add constraint FK_T_ORDER__REFERENCE_T_ORDER foreign key (ORDER_ID) references T_ORDER (ORDER_ID); |
我们承认在ER关系上,这份设计并不存在的缺陷,但却存在以下有待优化的地方:
·没有将表数据和索引数据存储到不同的表空间中,而不加区别地将它们存储到同一表空间里。这样,不但会造成I/O竞争,也为数据库的维护工作带来不便。
·ORACLE会自动为表的主键列创建一个普通B-Tree索引,但由于这两张表的主键值都通过序列提供,具有严格的顺序性(升序或降序),此时手工为其指定一个反键索引(reverse key index)将更加合理。
·在子表T_ORDER_ITEM外键列ORDER_ID上建立的IDX_ORDER_ITEM_ORDER_ID的普通B-Tree索引非常适合设置为压缩型索引,即建立一个压缩型的B-Tree索引。因为一份订单会对应多个订单条目,这就意味着T_ORDER_ITEM表存在许多同值的ORDER_ID列值,通过将其索引指定为压缩型的B-Tree索引,不但可以减少IDX_ORDER_ITEM_ORDER_ID所需的存储空间,还将提高表操作的性能。
·企图仅通过建立一个包含3字段IDX_ORDER_COMPOSITE复合索引满足如前所述的两种查询条件方式的索引是有问题的,事实上使用ORDER_DATE+IS_SHIPPED复合条件的查询将利用不到IDX_ORDER_COMPOSITE索引。
![]() | 为HQ添加Oracle 10监控 | 12-02 |
![]() | 在oracle中导入导出dmp数据库文件 | 12-02 |
![]() | ORACLE查询或删除时指定使用索引的写法&s | 11-30 |
![]() | ORACLE分页查询SQL语法 | 11-30 |
![]() | Oracle数据库的十种重新启动步骤 | 12-06 |
![]() | 完全删除Oracle数据库的方法 | 12-06 |
![]() | 实例讲解Oracle里抽取随机数的多种方法 | 06-20 |
![]() | 在Oracle中实现搜索分页查询 | 08-21 |
![]() | ORACLE问题与解答 | 9910 |
![]() | Oracle数据操作和控制语言详解 | 6526 |
![]() | oracle学习的好书 | 4731 |
![]() | 优化Oracle库表设计的若干方法 | 4252 |
![]() | Oracle数据库技术(1) | 3982 |
![]() | Oracle数据库日常维护手册 | 3908 |
![]() | 完全删除Oracle数据库的方法 | 2931 |
![]() | 数据库设计三大范式应用实例剖析 | 2601 |