以前都是用delete這樣的來洗掉幾條資料,沒有接觸過這樣大量洗掉,現在有點無能為力,麻煩大佬們幫幫忙
有張表為: INTERFACE_FROM_LOG,有1000多W資料
想按照:REQUEST_TIME 這個時間欄位小于2020-01-01這個條件來洗掉
請問大佬具體sql該怎么寫呢?
uj5u.com熱心網友回復:
大佬們,幫幫忙uj5u.com熱心網友回復:
沒看懂,一千多萬有什么關系,一樣deleteuj5u.com熱心網友回復:
本人新手小白,LZ試試這樣行不行,分時間段洗掉delete from interface_from_log where request_time between to_date('2018-01-01 00:00:00','yy-mm-dd hh24:mi:ss') and to_date('2020-01-01','yy-mm-dd hh24:mi:ss')
uj5u.com熱心網友回復:
如果直接delete,導致記憶體還是被占用呢,這個該怎么解決呢?uj5u.com熱心網友回復:
分批洗掉就行了,每次洗掉10000行,洗掉完成馬上執行一個 commit ;uj5u.com熱心網友回復:
簡單粗暴一點,按照時間加磁區,需要刪資料的時候,直接洗掉磁區。uj5u.com熱心網友回復:
給你提供一個思路,如果洗掉表中的大部分資料,可以CTAS新表把需要保留的資料插入到新表中,然后再通過rename方式切換下。uj5u.com熱心網友回復:
不用delete1、CREATE TABLE INTERFACE_FROM_LOG_BAK AS SELECT * FROM INTERFACE_FROM_LOG WHERE REQUEST_TIME >= '2020-01-01';--select看一下保留的資料有沒有問題
2、DROP TABLE INTERFACE_FROM_LOG;
3、CREATE TABLE INTERFACE_FROM_LOG AS SELECT * FROM INTERFACE_FROM_LOG_BAK ;
uj5u.com熱心網友回復:
delete資料太多回滾段會不夠用而且都是逐行操作很慢,就算按樓主的分步提交delete還是慢,直接繞過delete好了uj5u.com熱心網友回復:
如果長期有這個操作需求還是考慮建磁區表比較好,就按你的刪選條件分uj5u.com熱心網友回復:
大佬意思是先把要需要保留的查處來然后放到一個臨時表里,然后洗掉原表,在把保留的讀取回原表嗎
uj5u.com熱心網友回復:
用臨時表把主鍵記錄下來,然后用游標回圈臨時表的資料去洗掉源表,每次就是刪一條記錄,一定數量commit一次,這樣就不會占用了uj5u.com熱心網友回復:
創建一張同結構臨時表,把大于等于20200101的資料存到臨時表中,查看存放資料是否正確,把原表truncate掉,再把臨時表資料插回原表,三個月不到的資料很快的,后面操作這張表也會快很多uj5u.com熱心網友回復:
1、洗掉大量資料,最好是通過drop partition或truncate partition來操作;2、按照樓主的意思,應該是洗掉表中的大部分資料,就是洗掉2020年1月1號之前的所有資料,其實,如果服務器性能還可以的話,直接delete from INTERFACE_FROM_LOG where REQUEST_TIME<'2020-01-01';
否則,就得想辦法,比如:
alter table INTERFACE_FROM_LOG rename to INTERFACE_FROM_LOG_bak;
create table INTERFACE_FROM_LOG as select * from from INTERFACE_FROM_LOG where REQUEST_TIME>='2020-01-01';
關鍵看洗掉多少資料。
uj5u.com熱心網友回復:
1、我可不可以先將大于這個時間的放在一張新表,然后洗掉這個表,再將新表的名字改成這個表。2、如果是按照時間磁區的,我寫匿名塊,洗掉磁區的資料就行了。
如果這兩個方法不行,你就delete吧。
uj5u.com熱心網友回復:
你這個表太適合用磁區表了。不用就是給自己找麻煩。
uj5u.com熱心網友回復:
磁區表怎么洗掉資料和不磁區表是不是不一樣uj5u.com熱心網友回復:
還是建議改成時間磁區或者你可以直接使用interval 磁區。。。。維護非常方便。delete方式很容易產生性能問題。試想哪天突然delete失敗了,要回滾。。。
uj5u.com熱心網友回復:
declare cursor ID_KEY_CURSOR is
SELECT t.senddate senddate from ICDRPT.SUM_PROVINCE_BUSINESS_H15 t where substr(t.senddate,1,8) < '20190101';
begin
for V_TO_DEL in ID_KEY_CURSOR loop
DELETE FROM ICDRPT.SUM_PROVINCE_BUSINESS_H15
WHERE ICDRPT.SUM_PROVINCE_BUSINESS_H15.SENDDATE = V_TO_DEL.senddate;
if mod(ID_KEY_CURSOR%Rowcount, 5000) = 0
then commit;
end if;
end loop;
commit;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/6877.html
標籤:基礎和管理
上一篇:怎么處理from 變數表
