① ORACLE大数据表Update处理
ORACLE中如果表数据量很大(M级或更大) update某个字段是很慢的(如我的HIS项目中更新历史业务流程表 万条记录 用CURSOR来更新 条MIT一次 花了 天也没更新完) 后来尝试过的改进办法有
把表上的LOGGING取消
把表上的INDEX取消
但是依然很慢 无奈下找到这个
没陪在这个主题问答里 ORA官方提了一种处理的办法
利用CREATE table as select xxxxx的办法来生成一新表T
在T 上创建与目标表一样的索引
把目标表删除或RENAME(注意备份以备反悔)
把T 改名成目标表
试了一下 果然非常岁察如地快 我的任务差不多在 Min就完成了
如csywdk table_room是一张大表 要删除其中bakfwid在noNewYWFW 中的记录 且要更新bakfwid在imp_table_room中记录的ROOM_LOC为imp_table_room room_loc:
( )创建新表
create table tmp_new_table_room as
select t ROOM_ID t NEWROOMID t BUILDID t TFH t DKH t BUILD_NO t LAYER_NO t ROOM_NO t ROOM_NAME
decode(t bakfwid null t ROOM_LOC t room_loc)
t ROOM_AREA
t SURTYPE t LAYER_NAME t DEVDEP t CELL t DELFLAG t QXXZ t SJSJLSH t FD t ID t BAKFWID
from csywdk table_room t left join imp_table_room t on t bakfwid=t bakfwid
where not exists(select from noNewYWFW t where t bakfwid=t bakfwid)
( )创建备份表
create table Table_room as
select * from csywdk table_room
( )替换原表
drop table sde table_room
create table sde table_room as
select * from tmp_new_table_room
在这个问答里还提到一句ORA PL/SQL效率相关的话
能用一句语句处理的任务决不乎启要用多句编程来实现
lishixin/Article/program/Oracle/201311/18980
② 想update一个大表,数据量四千万左右,如何通过调整Oracle数据库的某些参数来提高性能,还请各位大虾指教~
优化update要根据使用方式决定:
1.如果是在线事务系统,那么建立合适的索引非常专重要,其次通过分属区技术设立合理的分区键也可以大大提升更新前的查找定位效率。
2.如果是后台批量数据分析系统,一次需要更新表中数据的大部分,那么可以考虑使用临时表过度,采用insert到临时表再替换原表的方式代替update操作,这样效率的提升非常可观,对系统的压力也小很多。也可以使用分区技术,对多个分区并行update操作以提升效率,但是系统的压力也会随之增大。
③ oracle 大数据量update优化方案
sql 写法有问题的,抄aa 表读了两次。
改写成如下试试
UPDATE aa
SET TRADE_STATUS = '0'
where exists (
select 1 from bb d where d.id= c.id and d.state= c.state
and d.DAY = '20150503'
) and c.TYPE = '1' AND c.PAYDATE is null;
bb 表上的 id 、 state 和 DAY 上应建组合索引,这样子查询效率很高。
aa 表上 TYPE 可以根据数据量考虑是否建索引;如果 TYPE =1 占比很小 (比如小于 1/30 建索引可能快些,否则 全表扫描 一次读取多个数据块;可能全表扫描效率更好)
④ Oracle更新(update)某大数据量的表的最优方法(语句)请教。解决送分。
建议你通过某个条件把这150万条记录,分成多个部分,写个存储过程,依次执行,执行完一部分就提交一部分。
这样即即减少了对内存的要求,也防止玩意update出错,还要花费大量的时间在回滚上。
⑤ oracle几百万条数据怎么update
首先要区分具体情况,虽然表里有几百万几千万的数据量,但是update是同时update这几百万条的数据呢?还是只更新其中某几条? 更新的数据量不同,解决方案自然也就有差异。同时update几百万数据,这个sql的性能影响在于数据库会做回滚段,以便异常时rollback。由于数据量大,性能就浪费在回滚段上了。 所以有2个方案供参考:
1. update时 ,禁用回滚段的生成,跟你前面说的nologing应该是一个意思
2. 分批更新,比如每更新10W条数据,就执行一次commit,这样效率也会比原来的要快。