最近遇到了清理歷史資料的需求,整理一下不同場景及對應處理方法
這是最簡單的,
truncate / drop table即可
。這種情況是,**會不斷往表裡插入新資料但是並不會去查詢,一般是系統異常時開發手動去查。
這種情況可以停業務將原表重新命名為bak表,再按原有表結構建立乙個新錶讓系統插入。bak表根據業務要求時間保留,例如三個月,三個月後刪除。
-- 重新命名
exec sp_rename 'mytab','mytab_bak';
-- 建立新錶
select * into mytab from mytab_bak;
--按原表建立索引、約束
這其實才是大部分時候會遇到的情況,對於業務表,通常無法使用前面兩種討巧的方法。
首先需要對錶的資料量和需刪除的資料量做乙個統計,計算刪除的比例。
sp_spaceused 'dbo.test';
select count(*) from test where 《刪除條件》
根據要刪除的資料量可以再分為兩類
這個絕大部分怎麼定義不好量化,所以我們這裡就量化為60%。如果刪除的資料比例超過60%,就採用下面方法:
對於有alwayson的資料庫,事務日誌收縮相當麻煩,必須注意insert資料量和產生的事務日誌量。如果實在很大,需要分批insert並手動備份事務日誌。
-- 建立臨時表
select * into mytab_tmp from mytab where ***;
dbcc sqlperf(logspace);
--按時間批量插入資料
declare @begindate datetime = '2020-02-01';
while @begindate <= '2020-08-24'
begin
insert tmp0824 select * from schemalog where logdate>=@begindate and logdate
如果刪除條件欄位無索引,可以考慮先建上刪除完索引後再刪除該索引,否則全表掃瞄執行時間可能非常長。
用小批量分批次刪除通常比一次性刪除效能要快很多,同時避免鎖粒度過大且鎖定的時間非常長,和事務日誌變得巨大。
到底一次性刪除多少數量的記錄sql效率最高呢?這個真沒有什麼規則計算,個人測試對比過一次刪除10000或100000,沒有發現什麼特別規律。不過一般用10000,在實際操作過程,可以通過做幾次實驗對比後,選擇乙個合適的值即可。
案例1
declare @delete_rows int;
declare @delete_sum_rows int =0;
declare @row_count int=100000
while 1 = 1
begin
delete top ( @row_count )
from dbo.[employeedaydata]
where workdate < convert(datetime, '2012-01-01 00:00:00',120);
select @delete_rows = @@rowcount;
set @delete_sum_rows +=@delete_rows
if @delete_rows = 0
break;
end;
select @delete_sum_rows;
案例2
declare @r int;
declare @delete_rows bigint;
set @r = 1;
set @delete_rows =0
while @r > 0
begin
begin transaction;
delete top (10000) -- this will change
mytab
where remark='今日未入' and operation_date
參考
刪除歸檔日誌
今天一早,同事說oracle資料庫連線不上。用sqlplus測試一下,報如下錯 ora 00257 archiver error.connect internal only,until freed.原因比較明顯,應該是歸檔日誌檔案太多造成磁碟或者裝置空間不足。官方的解釋就基本如此 簡單地,我們可以到...
sqlserver大資料歸檔
昨天做了個日常大資料歸檔,歸檔700w資料,表字段130左右,字段比較多,分享下!先禁用表的index 1.先獲取需要禁用的索引 declare tname varchar 100 set tname orders select alter index c.indexname on tname di...
SQL Server 資料歸檔方案
sql server 資料歸檔方案 方案一 方案介紹 bcp匯出資料到本地目錄目錄後,遍歷目錄檔案bcp匯入到臨時表,再迴圈刪除源表資料。通過insert into left join 通過主鍵關聯臨時表和歸檔表排除存在的資料。或通過2008及後續版本的merge語句,不存在插入,存在更新 方案優缺...