oracle INSERT SELECT 结果集 当 SELECT 结果集比较大的时候 怎么做比较好! 例如 结果集 有大于 500晚
5个回答
展开全部
不同的情况,考虑优化的原则不太一样.
如果是INSERT XXXXXX SELECT xxxxx FROM
这种语句的话,要考虑的东西就比较多.
从楼主的题目意思上来看,已经确定是由于数据量的问题,造成资源利用的消耗(比如系统缓存,比如回滚段),导致语句执行效率比较慢了?(一般500w的数据不算太多的...当然也要看具体情况)
如果确实是我猜测的这样,我给你出出主意。不考虑分区表和分区索引,此处不太适合你的描述。
第一种, 单独将此SELECT结果集建立新的临时表,建立合理的索引后.后续操作基于此表.这样做,可以减少资源的大吞吐,缩短执行时间.且操作简单,看你此处是否适用.
第二种, 编写存储过程,在该表上建立合适的索引,开游标进行数据处理(插入),批量(看具体参数)进行提交.
第三种, 按照楼主提出的思想,将原表分拣到一些子表中,再进行操作.
但rownum显然不行.
1 可以利用ROWID进行分拣。但用ROWID的话,要注意对ROWID进行转换(它不是普通字符串)后才能使用。
2 可以将原表完全拷贝到一张新表,并利用序列给每行生成一个行号(序列号),再利用行号进行表数据的分拣存储,从而将每次执行时的量降低。
当然,方法是很多的 希望能帮助到你!
如果是INSERT XXXXXX SELECT xxxxx FROM
这种语句的话,要考虑的东西就比较多.
从楼主的题目意思上来看,已经确定是由于数据量的问题,造成资源利用的消耗(比如系统缓存,比如回滚段),导致语句执行效率比较慢了?(一般500w的数据不算太多的...当然也要看具体情况)
如果确实是我猜测的这样,我给你出出主意。不考虑分区表和分区索引,此处不太适合你的描述。
第一种, 单独将此SELECT结果集建立新的临时表,建立合理的索引后.后续操作基于此表.这样做,可以减少资源的大吞吐,缩短执行时间.且操作简单,看你此处是否适用.
第二种, 编写存储过程,在该表上建立合适的索引,开游标进行数据处理(插入),批量(看具体参数)进行提交.
第三种, 按照楼主提出的思想,将原表分拣到一些子表中,再进行操作.
但rownum显然不行.
1 可以利用ROWID进行分拣。但用ROWID的话,要注意对ROWID进行转换(它不是普通字符串)后才能使用。
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的数据 分批次提交, 这样占用内存小, 相信会更好。
我也准备这么做。
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的数据 分批次提交, 这样占用内存小, 相信会更好。
我也准备这么做。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
。
create table a as select * from b where 1=0;
altere table a nologgin;
insert into /*+ append */ a select * from b;
或者 你使用分批处理、
create table a as select * from b where 1=0;
altere table a nologgin;
insert into /*+ append */ a select * from b;
或者 你使用分批处理、
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用FORALL进行批量绑定,分批插入数据
记得COMMIT可以释放资源,提升效率
记得COMMIT可以释放资源,提升效率
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要不就做个视图试试吧~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询