SQL Server 快速刪除 歸檔資料方法小結

2021-10-05 12:17:53 字數 2097 閱讀 9580

最近遇到了清理歷史資料的需求,整理一下不同場景及對應處理方法

這是最簡單的,

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語句,不存在插入,存在更新 方案優缺...