高分求助:oracle 大表更新,大约200万,insert和update太慢,如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高分求助:oracle 大表更新,大约200万,insert和update太慢,如何解决?相关的知识,希望对你有一定的参考价值。

最近工作需要,几乎天天要更新一张表有A表200万条数据,另一个临时表B有5000到500000条数据,需要从B表中一条一条去A表中核实,要是存在的话,更新A中的一些数据,没有的话就插入;A表没有分区,建有索引,A表正在使用;现在的情况是更新5000条就需要3个多小时,太慢;要是50W的话还不知道怎么的了,向各位高手求教,敬请不吝赐教,谢谢!解决好追加分数!!!!!!!!!!

简单的看看搂主的描述 "需要从B表中一条一条去A表中核实"
我估计是用 游标来处理的。
如果用游标一行一行 FETCH , 性能可能要打点折扣。
这种情况下,可以尝试使用 BULK COLLECT 来批量加载。
下面是 Oracle 游标处理II - 使用BULK COLLECT 的例子。
http://hi.baidu.com/wangzhiqing999/blog/item/2ea041cc0d4606037e3e6f20.html

又看了一下逻辑, 要是存在的话,更新,没有的话就插入。
如果没有其他的复杂的逻辑的话,那么用 MERGE 语句,可以直接处理掉。
下面是 MERGE 的例子
http://hi.baidu.com/wangzhiqing999/blog/item/2879207af3e388370cd7da86.html
参考技术A

写个存储过程,使用pl/sql MARGE INTO 方法

写法是这样的

  

详细访问百度问库:http://wenku.baidu.com/view/1308e0563c1ec5da50e27006.html

存储过程,你肯定会写,不会写就找我吧。我每天白天都在

参考技术B 数据库 jsp页面
varchar32 String
int int
long long

不需要设置编码,只要保证页面和数据库都是utf-8就可以了,看看你的表中的字段类型,再对照着看看页面设置的类型,是否一致,问题就解决了!
参考技术C 1. 先分步核实各动作消耗的时间, 确定缓慢原因
2. 如果是在A表中检索消耗的时间多, 则需要优化索引.
3. 如果是在插入的时间长, 需要优化系统配置, 系统优化关系方面太多, 无法在短篇内说明,
需要你去了解Oracle性能优化与操作系统优化的相关专著.
参考技术D 建一个游标或者触发器可以解决查询慢的问题,然后根据索引获取要修改或要插入的数据,这样就快多了

Oracle批量更新根据一个大表批量更新另一大表的方法比较

【问题】现在有两个千万级别的结构相同数据不同数据表T_SMS_PHONENO(目的表),T_SMS_PHONENO2(源表),根据源表数据更新目的表的数据。

【分析】根据经验,更新方法一般有以下几种:

1、直接update。

update T_SMS_PHONENO T Set    T.NAME=(select NAME from T_SMS_PHONENO2 where PHONENO=T.PHONENO)

2、采用分条更新。根据记录ID逐条更新。

open cur is select phoneno,name from T_SMS_PHONENO;

loop

   fetch cur in v_pn,v_name;

   update T_SMS_PHONENO T set T.NAME=v_name where v_pn=T.phoneno;

   exit when cur% notfound;

end loop

3、采用分批次更新。将数据按表分区字段或其他字段依次进行分批次更新。

open cur is select region from T_SMS_PHONENO group by region;

loop

   fetch cur in v_region;

   update T_SMS_PHONENO T set T.NAME=(select name from T_SMS_PHONENO2 where phoneno=T.Phoneno) where T.region=v_region;

   exit when cur% notfound;

end loop

4、虚拟一张表,唯一关联后进行更新。

update (select  T.name,T2.name name2 from T_SMS_PHONENO T,T_SMS_PHONENO2 T2 where T.phoneno=T2.phoneno) set name=name2;

5、Create 一张新表后进行更新。

create table TEMP_SMS_PHONENO as select * from T_SMS_PHONENO T,T_SMS_PHONENO2 T2 where T.phoneno=T2.phoneno;

生成新表,然后重命名表为T_SMS_PHONENO

【结论】

1、对于大表的更新如果采用直接update语句,则会直接产生大量回滚,并且时间很长,出现假死现象。

2、1小时。

3、30分钟。

4、2分钟。

5、30秒,因为不产生redo,undo动作,insert语句会很快。

如果存在唯一性关联字段的话,则采用第四种方法更新,是很快的,如果不存在唯一关联字段则需要分批次更新,或者create 个新表。

以上是关于高分求助:oracle 大表更新,大约200万,insert和update太慢,如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle批量更新根据一个大表批量更新另一大表的方法比较

【高分求助】连接服务器Oracle 11g数据库较慢

高分求助:怎么处理百万条的excel数据

高分求助:java对大批量数据进行操作

在 Hive 中使用 UDF 连接两个大表 - 性能太慢

PostgreSQL大表的更新时间