oracle上億條記錄大表delete

2021-06-25 10:56:56 字數 1822 閱讀 3436

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...