关于oracle insert的效率问题

我需要insertintoaselectxx1,xx2,xx3,decode(xx4,xx5,xx6)frombwhereb.xx1in(xx,xxx)现在b表中的数据有... 我需要insert into a select xx1,xx2,xx3,decode(xx4,xx5,xx6) from b where b.xx1 in (xx,xxx)
现在b表中的数据有1000多万,xx1是索引,可是我执行这条insert 要用6个小时。。。我该怎么办才能让这个快一些?数据库是归档模式。
请高手指点。我的财富值用完了,不好意思。
展开
 我来答
mailking2001
2011-10-02 · TA获得超过817个赞
知道小有建树答主
回答量:1037
采纳率:100%
帮助的人:761万
展开全部
1)确定a表是否有索引,触发器,约束,如果有禁用它们。这个很重要。
2)先要确定你查询语句的效率,和返回的记录数
select xx1,xx2,xx3,decode(xx4,xx5,xx6) from b where b.xx1 in (xx,xxx)
你这条查询语句的速度有多快,需要多久才能返回数据,返回多少数据.
如果返回的数据量比较大,你要考虑到a表的extent的分配问题,也就是说你需要提前分配extent给表a
3)你可以将a表所在的表空间在a表插入数据的时候,将a表所在的表空间启用到no logging状态
4)insert /*+append*/ into a select xx1,xx2,xx3,decode(xx4,xx5,xx6) from b where b.xx1 in (xx,xxx) 使用oracle的direct insert语句插入数据提高效率
5)如果数据量非常大,又不想使用上面的方法插入a表的话,
你可以
create table aa as
select xx1,xx2,xx3,decode(xx4,xx5,xx6) from b where b.xx1 in (xx,xxx)
建个aa 表,然后将aa表改名即可
ppphex
2011-10-02 · TA获得超过325个赞
知道小有建树答主
回答量:266
采纳率:100%
帮助的人:193万
展开全部
你先确定这个select语句的执行计划里有没有用上xx1这个索引。然后看看a表有没有触发器
追问
a表没有触发器。至于执行计划,我还不会看。。。我把执行计划贴出来,你看看。
追答
把执行计划贴出看看吧。
另外,a表有多少个索引,太多的话也会影响insert速度,一般需要频繁变动数据的表索引不应建超过5个。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式