delete /*+ use_hash(a,b) parallel(a,15)*/ from tabacca where exists (select 1 from temptablea b where a.id=b.id and b.type='1');
可以試試多個job分工,同時進行。
比如開10個job,每個job分十萬資料
declare
x number;
begin
for i in 0 .. 9
loop
dbms_job.submit (
x,'begin delete tabacca t1
where exists
(select 1
from (select id
from (select substr (to_char (rownum), -1) rn,
idfrom temptablea
where type = ''1'')
where rn = '''
|| i
|| ''') t2
where t2.id = t1.id);
commit; end;'
);end loop;
end;
分割槽表的話,就加一層分割槽進行迴圈。
for 分割槽
for i in 0.. 9
附:呼叫語句和引數說明:
dbms_job.submit( job out binary_integer,
what in archar2,
next_date in date,
interval in varchar2,
no_parse in boolean)
其中:● job:輸出變數,是此任務在任務佇列中的編號;
● what:執行的任務的名稱及其輸入引數;
● next_date:任務執行的時間;
● interval:任務執行的時間間隔
oracle的insert、update和delete在執行過過程中都是會產生日誌的,因此,當插入大量資料的時候可以新增「nologging」選項,以提高執行速度,三種操作所做的具體東西而相關資料是這樣寫的:
常insert產生最少的undo,update產生的undo居中,而delete操作產生的undo最多。
對於insert操作,回滾段只需要記錄插入記錄的rowid,如果回退,只需將該記錄根據rowid刪除即可;
對於update操作,回滾段只需要記錄被更新欄位的舊值即可(前映象),回退時通過舊值覆蓋新值即可完成回退;
對於delete操作,oracle則必須記錄整行的資料,在回退時,oracle通過乙個反向操作恢復刪除的資料。
因此insert是最快的
所以當遇到大量資料修改的時候,可以考慮用insert來代替update。
例子:有乙個表a有100萬條記錄,我現在要把這個表a備份成另外乙個表b。我用了兩種方式
create table b as select * from a
第二種是
create table b as select * from a where 1=0 可以加上(alter table b nologging)
insert into b select * from a
這兩種速度,差別是十幾倍。為什麼啊?
第一種屬於ddl語句,不產生redo,日誌量小
而第二種用到的insert 屬於dml,產生日誌,由於記錄多,產生的redo量也是很大的,還要寫很多log
oracle關聯表查詢記錄表最新一條記錄
from 表1 t1 join select row number over partition by 單據id order by 處理時間 desc rn from 表2 t2 on t1.單據id t2.單據id and t2.rn 1 t2表其實是由表2加乙個字段 rn row number ...
Oracle如何在億級記錄表中建立索引
1.前階段做了個專案,需要將生產系統中的乙個資料,匯出到備份機中,這個表近40個字段,14億條的資料。資料抽取用的是開源的etl工具,比較了一下,還是先導出txt檔案,在匯入到備份機中,速度最快。2.下面對匯入資料時遇到的問題進行分析 問題一 不要自動建立表空間。因表空間較大,一開始只建立了乙個表空...
ORACLE獲取資料庫表的前N條記錄
我剛開始修改乙個用oracle資料庫專案時,用sql select top 4 from table的方法想取得oracle資料庫表的前n條記錄 弄了很久老是出錯,後來才知道錯了 oracle得 用rownum n,不能用top 順便把網上的其它資料庫也記下 1.oracle select from...