zoukankan      html  css  js  c++  java
  • 优化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索引。




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

  • 相关阅读:
    jquery.cookie.js
    CSS实现三角形
    关于seajs模块化的搭建
    浏览器版本类型及版本
    js || 和 &&
    bootstraps字体图标无法显示
    Thymeleaf的一些操作
    C语言I博客作业02
    C语言I博客作业03
    20169306《网络攻击与防范》第二周学习总结
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1976076.html
Copyright © 2011-2022 走看看