一、oracle怎樣快速刪除大量的數據
針對數據量比較大的情況較好是分表,但是分表是有代價的,分表后程序也要做響應調整,這要求在前期規劃的時候就要考慮到這個問題。更普遍的做法采用分區比較多(個人看法)同時對老數據進行轉移,比如對登錄日志、盤存信息等可以將5年以前的數據進行歸檔,放到另外一張表中,使在用的表保持在一定的數據量(比如1000萬,500萬)。那么在歸檔完成后肯定需要對原表數據進行刪除,這個時候刪除的數據量可能就會比較大(500萬,1000萬)。那么在刪除大量數據的方法有哪些呢?本文針對oracle數據庫為例說明各種方法。
1、truncate命令
如果表數據都不要了,可以使用這個命令。此命令一旦使用無法恢復,慎用!??!
truncate table test;
2、臨時表
將表中數據轉移到臨時表,對原表使用truncate命令,然后再把數據導入原表。
缺點:不能在線使用
3、nologing模式
具體用法可以查看這篇文章oracle nologging用法(轉) – 滄海一滴 – 博客園
create table test_bak nologging as select * from test;
4、parallel
delete /*+ parallel(并行度) */ test where …;
并行度可以指定為cpu的核數。
缺點:可能會把數據庫搞死
5、化整為零
此方法就是一次刪除少一點數據,比如一次只刪除一個月,是一種笨方法。
DECLARE
? v_nums????? INTEGER := 24;
? v_start???? VARCHAR2(10);
? v_startdate DATE;
? v_enddate?? DATE;
? v_1???????? INTEGER;
BEGIN
? v_start := ‘2019-01-01’; –開始日期
? FOR v_1 IN 1 .. v_nums
? LOOP
??? v_startdate := add_months(to_date(v_start, ‘yyyy-mm-dd’), v_1 – 1);
??? v_enddate?? := add_months(v_startdate, 1);
??? dbms_output.put_line(v_1 || ‘-‘ || v_startdate || ‘-‘ || v_enddate);
??? DELETE FROM dd_goods_inventory_bak t
???? WHERE t.querydate < v_enddate
?????????? AND t.querydate >= v_startdate;
??? COMMIT;
? END LOOP;
END。
延伸閱讀:
二、實例(instance)是什么
一組Oracle 后臺進程/線程以及一個共享內存區,這些內存由同一個計算機上運行的線程/進程所共享。這里可以維護易失的、非持久性內容(有些可以刷新輸出到磁盤)。就算沒有磁盤存儲,數據庫實例也能存在。也許實例不能算是世界上最有用的事物,不過你完全可以把它想成是最有用的事物,這有助于對實例和數據庫劃清界線。