oracle INSERT SELECT 结果集 当 SELECT 结果集比较大的时候 怎么做比较好! 例如 结果集 有大于 500晚

使用 row_number 分批 进行 INSERT 可行吗!
2024-11-18 19:35:04
推荐回答(5个)
回答1:

不同的情况,考虑优化的原则不太一样.
如果是INSERT XXXXXX SELECT xxxxx FROM
这种语句的话,要考虑的东西就比较多.
从楼主的题目意思上来看,已经确定是由于数据量的问题,造成资源利用的消耗(比如系统缓存,比如回滚段),导致语句执行效率比较慢了?(一般500w的数据不算太多的...当然也要看具体情况)
如果确实是我猜测的这样,我给你出出主意。不考虑分区表和分区索引,此处不太适合你的描述。
第一种, 单独将此SELECT结果集建立新的临时表,建立合理的索引后.后续操作基于此表.这样做,可以减少资源的大吞吐,缩短执行时间.且操作简单,看你此处是否适用.
第二种, 编写存储过程,在该表上建立合适的索引,开游标进行数据处理(插入),批量(看具体参数)进行提交.
第三种, 按照楼主提出的思想,将原表分拣到一些子表中,再进行操作.
但rownum显然不行.
1 可以利用ROWID进行分拣。但用ROWID的话,要注意对ROWID进行转换(它不是普通字符串)后才能使用。
2 可以将原表完全拷贝到一张新表,并利用序列给每行生成一个行号(序列号),再利用行号进行表数据的分拣存储,从而将每次执行时的量降低。
当然,方法是很多的 希望能帮助到你!

回答2:

DECLARE
TYPE BCb IS TABLE OF BC%ROWTYPE INDEX BY PLS_INTEGER;
books_in BCb;
books BCb;
BEGIN

SELECT *
BULK COLLECT INTO books
FROM BC;

FORALL books_in IN books.FIRST .. books.LAST
INSERT INTO BC1 VALUES books(books_in) ;
COMMIT;

我也遇到这种问题,我的数据量维持在630+W,
使用FORALL和BULK COLLECT 会有很好的效果。
你自己百度了解下吧。
上述SQL是我测试用的, 50W速度提高到原来的1/4,
你可以把FORALL的数据 分批次提交, 这样占用内存小, 相信会更好。

我也准备这么做。

回答3:


create table a as select * from b where 1=0;
altere table a nologgin;
insert into /*+ append */ a select * from b;

或者 你使用分批处理、

回答4:

使用FORALL进行批量绑定,分批插入数据
记得COMMIT可以释放资源,提升效率

回答5:

要不就做个视图试试吧~