OLTP 以进销存为例,存在订单主表 OrderMaster(BillNO varchar(15),Billdate smalldate,customerId int,....)
  从表 Orderdetail(BillNo varchar(15),Sequen int,....)  主表 Billno varchar(20) 唯一作主键,Billno 不为顺序增长。从表 BillNo,Sequen 唯一作主键。
由于根据时间查询报表多,故在主表上以Billdate 作聚集索引,但是从表却没有Billdate 字段,如果以BillNo,Sequen 唯一作主键并作为聚集索引的话,必然会导致从表上读取页过多。是否可以非正规化设计,将从表上也加个Billdate字段作为聚集索引呢?有没有这样的案例。谢谢。

解决方案 »

  1.   

    ---使用索引优化数据库查询效率
    1.不宜创建索引的情形
    (1)经常插入,修改和删除的表
    (2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间2.适合创建索引的情形
    (1)为where子句中出现的列创建索引
    (2)创建组合索引
    (3)为group by 子句中出现的列创建索引3.聚集索引的设计原则
    (1)该列的数值是唯一的或者很少有重复的记录
    (2)经常使用between ...and..按顺序查询的列
    (3)定义identity的唯一列.
    (4)经常用于对数据进行排序的列.---无法使用索引的select语句
    1.对索引列使用了函数,如:
    select * from tb where max(id)=1002.对索引列使用了'%xx',如:
    select * from tb where id like '%1'
    需要注意的不是所有使用like关键字的select 语句都无法使用索引,比如
    select * from tb where id like '1%'就可以使用索引3.在where子句中对列进行类型转换(其实也是使用到了函数)4.在组合索引的第1列不是使用最多的列,如在下面3个查询语句中建立组合索引,按顺序包含col2,col1,id列;
    select * from tb where id='1' and col1='aa'
    select id,sum(col1) from tb group by id
    select * from tb where id='2' and col2='bb'
    则第一句和第二句无法使用到索引 所以需要注意组合索引的顺序5.在where 子句中使用in关键字的某些句子
    当在in关键字后面使用嵌套的select语句,将无法使用在该列上定义的索引
    如:
    select 
     *
    from
     ta 
    where
     id 
    in
     (select id from tb where ....)--这样可以用到索引
    select * from tb where id in('1','2')本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2010/01/12/5183068.aspx
      

  2.   

    联接字段就是BILLNO ,由于都有主键,所以肯定是有索引的了,关键是效率的问题。
      

  3.   

    用ID关联 ,那以什么字段来做聚集呢?你的意思是指,主表仍然以BILLdate为聚集,然后增加一个自动ID列,从表就以ID列为聚集?这样的结构我倒是好像见过,不过跟直接增加一个BILLDate (SmallDate)列有什么优势呢?
     劣势:ID一般来说怎么也得用INT 型,4字节,SmallDate 3字节。
     优势:ID是一个唯一值,能很快定位要查找的位置,如果是BILLDATE 做聚集,如果每天产生的数据量过大的话,重复值太多就不好了。
    不知这样理解对不?
      

  4.   

    billno 做主键,billdate 再建个索引了