我们程序的需求是 从其他系统采集数据到我们系统中,然后再进行处理。
每天晚上凌晨先truncate掉我们系统中的表,然后采集当天的数据到数据库。采集方式是用ctl控制文件方法导出db文件再把db文件导入我们数据库的方法,不是直接insert。
采集到我们系统中的表有20张,数据量为1000W以上的大概有八张,我把这20张表称为原始表。我们用这20张原始表通过SQL查询语句与对应的业务需求做成10张报表(结果表)。
因为有几张表数据量很大,所以查询起来的时候速度很慢,所以想到了建立索引的方式来提高效率。
insert into 结果表1 select col1,col2,col3... from 原始表1,原始表2 where XXX and XXX....
上面是我们生成报表的的类似语句。
那么问题来了:
1,我所了解的索引一般是建立在不常变更的表上面的,但是我们的表每天都会被truncate,这样是不是会影响效率?truncate有索引和没索引的表速度一样么?
2,虽然我们的数据不是用insert到数据库的,导入数据会因为表有索引会对导入速度有影响么?顺便问下,如果insert到数据库,因为存在索引,是不是效率很低?
3,有没有什么其他好办法来提高效率。
------解决思路----------------------
1,truncate没索引的表快
2,索引会降低表导入速度
3,把文件放在在数据库服务器上用数据库自带工具导入(如果能保证逻辑正确,导入前删掉索引 触发器 主键之类的,导完之后 在建索引触发器 主键)
------解决思路----------------------
固定的脚本 机器反复运行就行了
------解决思路----------------------
索引会导致插入数据变慢,tuncata估计影响不大,它将将表drop之后再重建的,关于楼上每次删除索引再加上我认为也不合适,因为你加索引的时候照样也是要费很多时间的
------解决思路----------------------
找个试试就知道了
------解决思路----------------------
1 truncate 属于物理层的断开表结构文件与表数据文件的关系,有没有索引对该操作没有影响
2 索引会影响导入数据,建议先导入所有数据后再建立索引