优化Oracle库表设计的若干好多行动1

 起原:天极网




    前言

  绝除夜除夜都的Oracle数据库功效标题问题都是因为数据库设计不合理形成的,只需少部门标题问题根植于Database Buffer、Share Pool、Redo Log Buffer等外存模块设置配备摆设不合理,I/O争用,CPU争用等DBA职责范畴上。所以除非是面临一个业已完成不成调动的细碎,不然我们不该过多地将存眷点投向内存、I/O、CPU等功效调停项目上,而应存眷数据库表自己的设计能否合理,库表设计的合理性才是次第功效的真正执牛耳者。
合理的数据库设计需求思量以下的方面:

  ·营业数据以何种行动表达。如一个员工有多个Email,你可以在T_EMPLOYEE表中设立培植多个Email字段如email_1、email_2、email_3,也可以树立一个T_EMAIL子表来存储,乃至可以用逗号疏散隔多个Email所在寄放在一个字段中。

  ·数据以何种行动物理存储。如除夜表的分区,表空间的合理设计等。

  ·怎样设立培植合理的数据表索引。表索引几乎是行进数据表盘问功效最有效的行动,Oracle拥有类型丰厚的数据表索引类型,怎样取舍选择显得特殊首要。

  本文我们将眼光首要聚焦于数据表的索引上,同时也将说起其他两点的内容。经由对一个简单的库表设计实例的说明引出设计中的缺乏,并一一纠正。思量得手工编写库表的SQL脚起原根基始且低效,我们将用目前最流行的库表设计东西PowerDesigner 10来陈述表设计的历程,所以在本文中你还会体会到一些干系的PowerDesigner的运用本领。

  一个简单的例子

  某个启示人员着手设计一个订单的细碎,这个细碎中有两个首要的营业表,别离是订单根基信息表和订单条款表,这两张表具有主从干系的表,个中T_ORDER是订单主表,而T_ORDER_ITEM是订单条款表。数据库设计人员的设计效果如图 1所示:


图 1 订单主从表


  ORDER_ID是订单号,为T_ORDER的主键,经由名为SEQ_ORDER_ID的序列孕育发作键值,而ITEM_ID是T_ORDER_ITEM表的主键,经由名为SEQ_ORDER_ITEM的序列孕育发作键值,T_ORDER_ITEM经由ORDER_ID外键关联到T_ORDER表。

  需求文档指出订单记实将经由以下两种行动来盘问数据:

  ·CLIENT ORDER_DATE IS_SHPPED:依照"客户+订货日期 能否发货"前提盘问订单及订单条款。

  ·ORDER_DATE IS_SHIPPED:依照"订货日期 能否发货"前提盘问订单及订单条款。

  数据库设计人员依照这个要求,在T_ORDER表的CLIENT、 ORDER_DATE及IS_SHPPED三字段上设立培植了一个复合索引IDX_ORDER_COMPOSITE;在T_ORDER_ITEM为外键ORDER_ID设立培植IDX_ORDER_ITEM_ORDER_ID索引。

  让我们看一下该份设计的最终SQL脚本:

/*订单表*/
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索引。




版权声明: 原创作品,容许转载,转载时请务必以超链接编制标明文章 原始来由 、作者信息和本声明。不然将追查执法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1976076.html