我现在有一个表,数据量>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')
创建了一个临时表来进行测试,表建好后,创建了与原表一样的主键和索引。
再以该临时表为源运行报表时,发现执行速度竟然比原来更慢,狂晕。实在是不解。还望高人能指点一二,再问一下达人,不知道有什么更好的数据表优化方法???解决问题就给分。不够再开贴。谢谢了
对一些关键字段,我建了索引,大概总数有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')
创建了一个临时表来进行测试,表建好后,创建了与原表一样的主键和索引。
再以该临时表为源运行报表时,发现执行速度竟然比原来更慢,狂晕。实在是不解。还望高人能指点一二,再问一下达人,不知道有什么更好的数据表优化方法???解决问题就给分。不够再开贴。谢谢了
t_tx_log的operation_time字段的类型是什么?
你的系统中ORACLE执行上面的SQL的计划是怎样的?
2.operation_time是date类型。我在这里用的'08/10/2005'格式,是我用golden工具里的默认日期格式。
3.我没安排执行计划 ,是我用来临时统计数据,执行环境在golden里。
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 我想会快点的