oracle大數據全表更新
㈠ ORACLE 更新大的表,每3000行commit一次
UPDATE C_TABLE C SET C.NAME1= C.NAME2 WHERE C.NAME2 IS NOT NULL AND ROWNUM <= 3000;
你的條件,C.NAME2 IS NOT NULL ,所能查詢出的數據始終沒變,再加上ROWNUM <= 3000,也是結果始終未變,要麼第二次查詢3000-6000,或者查詢的欄位NAME2發生變化,使得數據查詢結果變化。
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 大表更新,大約200萬,insert和update太慢,如何解決
簡單的看看摟主的描述 "需要從B表中一條一條去A表中核實"
我估計是用 游標來處理的。
如果用游標一行一行 FETCH , 性能可能要打點折扣。
這種情況下,可以嘗試使用 BULK COLLECT 來批量載入。
下面是 Oracle 游標處理II - 使用BULK COLLECT 的例子。
http://hi..com/wangqing999/blog/item/2ea041cc0d4606037e3e6f20.html
又看了一下邏輯, 要是存在的話,更新,沒有的話就插入。
如果沒有其他的復雜的邏輯的話,那麼用 MERGE 語句,可以直接處理掉。
下面是 MERGE 的例子
http://hi..com/wangqing999/blog/item/2879207af3e388370cd7da86.html
㈣ 用oracle怎麼更新表中的全部數據
update table set 。。。。
不加where條件就是全表更新
㈤ oracle中如何全量update數據
createorreplaceprocerecreate_table(Ainvarchar2,Binvarchar2)as
v_sqlvarchar2(2000);
begin
v_sql:='droptable'||A;
executeimmediate'
v_sql';
v_sql:='createtableAasselect*from'||B;
executeimmediate'v_sql';--動態SQL為DDL語句
end;
不能delete和insert看來只能drop掉了
㈥ 如何提高ORACLE大數據表Update效率
1.把表上的取消
2.把表上的INDEX取消
但是依然很慢,無奈下找到這個:
http://asktom.oracle.com/pls/asktom/f?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
㈦ oracle 如何處理更新大數據量
樓下的看清楚,有50k的照片,不管blob還是long raw處理起來都是很慢的
2G數據拷貝也不是秒級的操作。
你的pga對於你的數據過小,很容易導致大量而外i/o,操作最好是分批提交,不要一條sql寫入。
㈧ 如何提高Oracle大數據表Update效率
ORACLE中如果表數據量很大(級或更大),update某個欄位是很慢的(如我的HIS項目中更新歷史業務流程表,160萬條記錄,用CURSOR來更新,1000條COMMIT一次,花了4天也沒更新完),後來嘗試過的改進辦法有:
1.把表上的LOGGING取消
2.把表上的INDEX取消
但是依然很慢,無奈下找到這個:
http://asktom.oracle.com/pls/asktom/f?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)某大數據量的表的最優方法(語句)請教。解決送分。
建議你通過某個條件把這150萬條記錄,分成多個部分,寫個存儲過程,依次執行,執行完一部分就提交一部分。
這樣即即減少了對內存的要求,也防止玩意update出錯,還要花費大量的時間在回滾上。