如何提高Oracle大数据表Update效率

如题所述


ORACLE中如果表数据量很大(M级或更大),update某个字段是很慢的(如我的HIS项目中更新历史业务流程表,160万条记录,用CURSOR来



Oracle中如果表数据量很大(M级或更大),update某个字段是很慢的(如我的HIS项目中更新历史业务流程表,160万条记录,用CURSOR来更新,1000条COMMIT一次,花了4天也没更新完),后来尝试过的改进办法有:
1.把表上的LOGGING取消
2.把表上的INDEX取消
但是依然很慢,无奈下找到这个:
?p=100:11:0::::P11_QUESTION_ID:6407993912330
在这个主题问答里,ORA官方提了一种处理的办法:
1.利用CREATE table as select xxxxx的办法来生成一新表T1
2.在T1上创建与目标表一样的索引
3.把目标表删除或RENAME(注意备份以备反悔)
4.把T1改名成目标表
试了一下,果然非常地快,我的任务差不多在2Min就完成了。
如csywdk.table_room是一张大表,要删除其中bakfwid在noNewYWFW20081205中的记录,且要更新bakfwid在imp_table_room中记录的ROOM_LOC为imp_table_room.room_loc:
(1)创建新表
create table tmp_new_table_room081205 as
select t1.ROOM_ID,t1.NEWROOMID,t1.BUILDID,t1.TFH,t1.DKH,t1.BUILD_NO,t1.LAYER_NO,t1.ROOM_NO,t1.ROOM_NAME,
decode(t2.bakfwid,null,t1.ROOM_LOC,t2.room_loc)
t1.ROOM_AREA,
t1.SURTYPE,t1.LAYER_NAME,t1.DEVDEP,t1.CELL,t1.DELFLAG,t1.QXXZ,t1.SJSJLSH,t1.FD,t1.ID,t1.BAKFWID
from csywdk.table_room t1 left join imp_table_room t2 on t1.bakfwid=t2.bakfwid
where not exists(select 1 from noNewYWFW20081205 t3 where t3.bakfwid=t1.bakfwid)
(2)创建备份表
create table Table_room081205 as
select * from csywdk.table_room
(3)替换原表
drop table sde.table_room
create table sde.table_room as
select * from tmp_new_table_room081205
在这个问答里还提到一句ORA PL/SQL效率相关的话:
“能用一句语句处理的任务决不要用多句编程来实现”。
原来老是怕一句执行时,回滚段不够大,看来只能准备好硬盘为上策了

温馨提示:内容为网友见解,仅供参考
无其他回答

如何提高Oracle大数据表Update效率
后来尝试过的改进办法有:1.把表上的LOGGING取消2.把表上的INDEX取消但是依然很慢,无奈下找到这个:?p=100:11:0:::P11_QUESTION_ID:6407993912330在这个主题问答里,ORA官方提了一种处理的办法:1.利用CREATE table as select xxxxx的办法来生成一新表T12.在T1上创建与目标表一样的索引3.把目标表...

oracle 对于多个大表关联操作如何优化速度?
1、首先要建立适当的索引。sql在索引字段不要加函数,保证索引起效。如果是复合索引注意在sql的顺序。如果已经存在索引,建议你先重建索引先,因为大数据表的索引维护到了一个阶段就是乱的,一般建议重建。建立好的一般可以获得几十倍的速度提升。2、最大数据量的表放在最前,最小的表放在最后面。sql是...

oracle大数据量更新引发的死锁问题解决方法及oracle分区和存储过程的思...
起初,由于表已按时间分区,尝试直接执行SQL语句时遇到了ORA-14402错误,原因是更新分区关键字列会导致分区的更改。解决这个问题的方法是先启用表的行移动功能(alter table xxx enable row movement),允许对分区字段进行更新。更新后别忘了关闭行移动(alter table xxx disable row movement)。然而,即使...

oracle如何提高大数据group by 的效率
设一些参数 或者 调整执行计划,见下面的语句:-- Script Tested above 10g -- Create a new temporary segment tablespace specifically for creating the index.-- CREATE TEMPORARY TABLESPACE tempindex tempfile 'filename' SIZE 20G ;-- ALTER USER username TEMPORARY TABLESPACE tempindex...

oracle大表关联怎样优化
看数据量,千万级以下的注意下小表关联大表就是,千万级以上必须应用上控制,2张大表都创建分区表,然后程序上控制表1分区表11遍历关联表2的所有分区,再表1分区表12遍历关联表2的所有分区。另外你可以大数据建议换数据仓库软件,比如extdata,大表关联性能很高,没什么优化地方。

oracle数据库,大数据操作问题,望高手给我解答。
你这张表已经有这么多条记录了估计现在建分区表都要很久,建议重建一张空表分区然后把新表表名和改成当前使用表(老的换成别的,一定要把2条改表名的sql一起执行)。弄完后老数据是放进去还是备份都行。

oracle如何最快的删除大数据量表中的多个字段
删除字段是把表中的字段去掉还是把表中该列的值修改为空?前者是DDL语句,用alter table table_name drop column colname 的方式执行,是DDL 语句,执行很快;后者只能用update table_name t set t.colname ='' 的方式进行,没有where 字句,一般是全表扫描。

oracle 大数据插入效率问题
1=1 and t.name='abc'select * from mytable t where t.name='abc'我实例测试了一下,这两句执行效率结果是一样的 对于上面千万数据集我觉得你的方法很好了。如果说最快的话你只能删除表重建,如:Create table B as select * from A 这应该是最快的了。但是不知道是否能符合你的要求 ...

Oracle数据库update和join on 的问题
效率不高,大数据量的话最好写个过程处理。UPDATE T_PARTY_GRADE T1 SET T1.GRADE_TYPE= (select GRADE_TYPE from T_GRADE T2 WHERE T1.PARTY_ID=T2.PARTY_ID) ,GRADE_LEVEL = (select GRADE_LEVEL from T_GRADE T2 WHERE T1.PARTY_ID=T2.PARTY_ID)

oracle一张上千万记录的数据表需要改为分区表,用什么方法好?
Oracle的普通表没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并说明它们各自的特点。 方法一:利用原表重建分区表。 步骤: SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); 表已创建。 SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_...

相似回答
大家正在搜