求助:如何提高Insert的效率

[复制链接]
查看11 | 回复9 | 2011-6-1 15:32:28 | 显示全部楼层 |阅读模式
我现在的程序每天有400万左右的数据向一个目标表Insert,过了一个一个月后发现速度非常慢,各位,有没有什么好的优化的策略
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
有没有考虑表分区, 有没有试加些提示,比方nologing append parallel等,400万的insert肯定会慢
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
1、如此大的数据量,不要insert,用sqlldr进行导入;
2、目标表必须拆分,否则数据的增、删、改、查必然都会很慢;
3、尽量优化索引,数据量如此大,如果索引很多的话,必然引起增、删、改的性能差,能合并的尽量合并;
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
2、用表分区也一样
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
最初由 nmgzw 发布
[B]有没有考虑表分区, 有没有试加些提示,比方nologing append parallel等,400万的insert肯定会慢 [/B]

分区了,但是按月分区
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
最初由 流浪星 发布
[B]1、如此大的数据量,不要insert,用sqlldr进行导入;
2、目标表必须拆分,否则数据的增、删、改、查必然都会很慢;
3、尽量优化索引,数据量如此大,如果索引很多的话,必然引起增、删、改的性能差,能合并的尽量合并; [/B]

你是说把我每天计算的临时表导出来,然后在用sqlldr么,这也是一个方案,谢谢
目前我和DBA商量了一下,准备把PK去掉,估计这样可以节省不少检查的时间。
我想问一下,如果我在算好的临时表上开一个Cursor,10000条10000条的INsert,会不会好很多
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
呵呵,你是从临时表往目标表insert的啊,我还以为是从外部往数据库插入呢。
1、如果可以的话,先删除目标表索引,insert完后再重建会快很多;
2、insert的话最好多提交,10000条记录提交一次是个不错的选择。
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
呵呵,你是从临时表往目标表insert的啊,我还以为是从外部往数据库插入呢。
1、如果可以的话,先删除目标表索引,insert完后再重建会快很多;
2、insert的话最好多提交,10000条记录提交一次是个不错的选择。

同意!
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
如果你可以接受清空目标表数据,那你可以每次这样。
drop table a;
create table a as select * from b;
alter table add constraint ....
另外建议指定rollback segment
回复

使用道具 举报

千问 | 2011-6-1 15:32:28 | 显示全部楼层
居然要清空表数据,那种方案肯定行不通的。
建议去掉PK,用session级的临时表往主表中批量insert数据,每5000或者多少条commit一次,插完以后,再加PK
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行