oracle中truncate和索引的问题

ifvlr 2015-01-14 07:52:24
我们程序的需求是 从其他系统采集数据到我们系统中,然后再进行处理。
每天晚上凌晨先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,有没有什么其他好办法来提高效率。
...全文
693 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ifvlr 2015-01-22
  • 打赏
  • 举报
回复
引用 2 楼 z_shousi 的回复:
采用不写日志及使用Hint提示减少数据操作的时间。 1)先修改表为不写日志 sql> alter table table_name NOLOGGING; 2)插入数据: INSERT /*+Append*/ INTO tab1 SELECT * FROM tab2; 3)插入完数据后,再修改表写日志: sql> alter table table_name LOGGING;
您说的第二条的方法 是指我从原始表插入结果表的时候做么?我之前查到使用 /*+Append*/ 会使数据库很臃肿?这样做好吗?
ifvlr 2015-01-22
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
1,我所了解的索引一般是建立在不常变更的表上面的,但是我们的表每天都会被truncate,这样是不是会影响效率?truncate有索引和没索引的表速度一样么? 没有影响,truncate 有索引和无索引的速度是一样的,因为你的数据量比较大,建议你在重新写入数据后,收集下这几张表的统计信息。 2,虽然我们的数据不是用insert到数据库的,导入数据会因为表有索引会对导入速度有影响么?顺便问下,如果insert到数据库,因为存在索引,是不是效率很低? 有索引导入时,速度肯定要比没有索引要慢,具体慢多少取决索引的个数和索引关联列的个数。 3,有没有什么其他好办法来提高效率。 1.insert 时 可以加一个 /*+ append */选项 2.1000W 的数据,建议分批导入,比如分成 100批次,每次提交10W 行。 3.可以考虑,在insert 之前,把索引先干掉,再 append 到表中,导完后,再增加索引,再收集统计信息。
非常感谢!还想问下,如果不重建索引,新导入的数据会被索引关联起来吗? 还有,一般是怎么自动删除索引再重建索引的呢?
美到心痛 2015-01-16
  • 打赏
  • 举报
回复
楼上说的都挺好的,可以测试一下 另外楼主的需求,也可以考虑通过dblink 建物化视图的方式~
  • 打赏
  • 举报
回复
采用不写日志及使用Hint提示减少数据操作的时间。 1)先修改表为不写日志 sql> alter table table_name NOLOGGING; 2)插入数据: INSERT /*+Append*/ INTO tab1 SELECT * FROM tab2; 3)插入完数据后,再修改表写日志: sql> alter table table_name LOGGING;
卖水果的net 2015-01-15
  • 打赏
  • 举报
回复
1,我所了解的索引一般是建立在不常变更的表上面的,但是我们的表每天都会被truncate,这样是不是会影响效率?truncate有索引和没索引的表速度一样么? 没有影响,truncate 有索引和无索引的速度是一样的,因为你的数据量比较大,建议你在重新写入数据后,收集下这几张表的统计信息。 2,虽然我们的数据不是用insert到数据库的,导入数据会因为表有索引会对导入速度有影响么?顺便问下,如果insert到数据库,因为存在索引,是不是效率很低? 有索引导入时,速度肯定要比没有索引要慢,具体慢多少取决索引的个数和索引关联列的个数。 3,有没有什么其他好办法来提高效率。 1.insert 时 可以加一个 /*+ append */选项 2.1000W 的数据,建议分批导入,比如分成 100批次,每次提交10W 行。 3.可以考虑,在insert 之前,把索引先干掉,再 append 到表中,导完后,再增加索引,再收集统计信息。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧