我现在有一个表,数据量>400万,字段数是47,表空间大概是1.1G。
对一些关键字段,我建了索引,大概总数有8个,都是单一索引。有主键ID
该表用于保存所有仓库的出入库数据,因为一开始设计该表的目的是为了做报表,所以冗余了大量的字段,因为一天当中仓库操作非常之多,所以该表的插入操作很频繁。现在出现的问题是,利用该表做收发存统计时,速度实在是慢的不行,虽然sql很简单,但时间就是慢。举例的sql如下:
select sku_code sku_code,
    sum(qty_in) as sum_in,
    sum(qty_out) as sum_out
from t_tx_log t1,t_warehouse t2
where t1.warehouse_id=t2.id and t2.code='111' 
      and t1.op_type not in (6,7)
      and t1.operation_time>='08/10/2005' and t1.operation_time<'10/01/2005't_tx_log就是该台帐表,其中warehouse_id,operation_time已经创建了索引。
现在我偿试着做数据移值,将该表中2005年以前的数据全部删除。我是通过
create table t_test as (select * from t_tx_log where operation_time<'01/01/2005')
创建了一个临时表来进行测试,表建好后,创建了与原表一样的主键和索引。
再以该临时表为源运行报表时,发现执行速度竟然比原来更慢,狂晕。实在是不解。还望高人能指点一二,再问一下达人,不知道有什么更好的数据表优化方法???解决问题就给分。不够再开贴。谢谢了

解决方案 »

  1.   

    请问t_warehouse表有多少记录,其中code='111'的记录又有多少?
    t_tx_log的operation_time字段的类型是什么?
    你的系统中ORACLE执行上面的SQL的计划是怎样的?
      

  2.   

    1.t_warehouse共有300多条记录,code='111'的只有一条记录
    2.operation_time是date类型。我在这里用的'08/10/2005'格式,是我用golden工具里的默认日期格式。
    3.我没安排执行计划 ,是我用来临时统计数据,执行环境在golden里。
      

  3.   

    我讲的计划是指SQL的执行计划,可以通过explain plan for select ...;然后查看plan table的内容。通常工具都有提供查看plan的方法。
      

  4.   

    单单就这个SQL,你应该建按warehouse_id,operation_time,op_type的联合索引才是最好的。
      

  5.   

    select tx.sku_code tx.sku_code,
        sum(tx.qty_in) as sum_in,
        sum(tx.qty_out) as sum_out
    from t_tx_log t1,t_warehouse t2
    where t1.warehouse_id=t2.id and t2.code='111' 
          and t1.op_type not in (6,7)
          and t1.operation_time>='08/10/2005' and t1.operation_time<'10/01/2005'在查询的时候加上t1 或者 t2 我想会快点的
      

  6.   

    t_tx_log表除了经常做insert操作还有其他吗?比如说delete?
      

  7.   

    如果还有其他操作的话,我的做法是:先把这张表里的数据移植到一张中间表,重建这张表及其索引,drop前先truncate,再把数据移植回来,另外一点是,经常做insert,delete操作的表上面的索引要定期重建的(rebuild)!