如测试的那样(参见文章no logging table test中的测试),insert append插入1000万行到一个没有索引的500M的表,在没有索引时只需要10分钟,有一个索引时耗时就暴涨到1小时10分钟。那么是否可以考虑在插入前后disable/rebuild索引来加快插入速度呢?Tom说不行。
[@more@]ASK TOM网站上的一篇文章:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1921387700346909109
TOM比较了两种做法:
·不更改索引:
insert /*+ Append */ into A select from B
Oracle会做三件事:
1、在高水位线以上插入数据。
2、在临时表空间中为新插入的数据创建mini-index structure。
3、数据插入完毕后,将mini-index与现有的索引合并。
·diable/rebuild索引
1. execute immediate 'disable A indexes'
2. insert /*+ Append */ into A select from B
3. execute immediate 'rebuild A indexes'
Oracle做两件事:
1、在高水位线以上插入数据。
2、数据插入完成后,对表做N次全表扫描——N等于索引的数量——来重建索引。
TOM建议:
·如果更改的行数几乎就是表的全部数据,可以使用disable/rebuild索引。
·如果表本身比较大,更改只是使它更大,最好不要更改索引。因为重建索引的时间会大大超过插入数据的时间。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8684388/viewspace-1045265/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8684388/viewspace-1045265/
本文通过对比测试发现,对于大规模数据插入操作,禁用并重建索引比直接插入更高效。文中详细介绍了两种方法的具体步骤及Oracle数据库的处理方式,并给出实际场景建议。
342

被折叠的 条评论
为什么被折叠?



