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

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

我也准备这么做。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yang07402
2011-02-24 · TA获得超过396个赞
知道小有建树答主
回答量:370
采纳率:0%
帮助的人:280万
展开全部

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

或者 你使用分批处理、
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
psychic0111
2011-02-24 · TA获得超过999个赞
知道小有建树答主
回答量:463
采纳率:100%
帮助的人:223万
展开全部
使用FORALL进行批量绑定,分批插入数据
记得COMMIT可以释放资源,提升效率
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
menghuan8465
2011-02-24 · TA获得超过658个赞
知道小有建树答主
回答量:247
采纳率:0%
帮助的人:203万
展开全部
要不就做个视图试试吧~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式