2015-09-09 50 views
0

我有一個數據庫,每天用增量數據填充數據,然後在每個月的月底將該月的數據全部下載到系統中。我們的業務希望每一天都投入到系統中,然後在每個月的月底將日常資料移除並留下完整的月份數據。我已經寫下了下面的查詢,如果你能幫助,我會很感激。使用while循環清除數據。

DECLARE @looper INT 
DECLARE @totalindex int; 

select name, (substring(name,17,8)) as Attempt, substring(name,17,4) as [year], substring(name,21,2) as [month], create_date 
into #work_to_do_for 
from sys.databases d 
where name like 'Snapshot%' and 
d.database_id >4 and 
(substring(name,21,2) = DATEPART(m, DATEADD(m, -1, getdate()))) AND (substring(name,17,4) = DATEPART(yyyy, DATEADD(m, -1, getdate()))) 

order by d.create_date asc 


SELECT @totalindex = COUNT(*) from #work_to_do_for 

SET @looper = 1 -- reset and reuse counter 
WHILE (@looper < @totalindex) 
    BEGIN; 

set @[email protected]+1 
    END; 

    DROP TABLE #work_to_do_for; 

我需要執行幾個表上的清除。

在此先感謝。

+0

大約每月有多少條記錄被清除? – rwking

+0

它可能是每個快照數百萬。 – mhodges

+0

好的。而你正在試圖用你發佈的查詢完成什麼? – rwking

回答

0

當我刪除大量的記錄時,我總是在批次和非工作時間進行,以免在生產過程中耗盡資源。爲了達到這個目的,您需要合併一個循環和一些測試,以便一次找到要刪除的最佳數字。

begin transaction del -- I always use transactions as a safeguard 
declare @count int = 1 

while @count > 0 
    begin 
    delete top (100000) t 
    from dbo.MyTable t -- JOIN if necessary 
    -- WHERE if necessary 

    set @count = @@ROWCOUNT 
end 

運行該手動(不WHILE循環)1次100000個記錄在括號中,看看你的執行時間是什麼。寫下來。再次運行200000條記錄。檢查時間;寫下來。用500000條記錄運行它。你正在尋找的是執行時間的趨勢。只要增加批量大小時刪除100000條記錄所需的時間就會減少,請繼續增加。您可能會以500k結束,但此方法將幫助您找到每批刪除的最佳數量。然後,將其作爲循環運行。這就是說,如果你真的刪除百萬個記錄,只要你不打算干擾其他進程,刪除和重新創建表可能更有意義。如果您需要保存某些的數據,您可以將所需的內容插入新表(例如MyTable_New),放棄原始表(MyTable),並將MyTable_New重命名爲MyTable。

+0

我需要進入包含日常文件的表格,然後使用該快照名稱將其刪除。我最大的桌子可以在最終的每日下載中刪除1000萬條記錄。我無法截斷或刪除表格,因爲我在表格中擁有7年以前的記錄。 – mhodges

+0

你有多少記錄保存在表格中?聽起來你需要做第二個選擇。 1.創建一個具有相同結構的新表。 2.插入要保留的記錄。 3.刪除舊錶並將新表重命名爲舊名稱。同樣,如果您保留了100 M記錄(例如),您不會希望將這些記錄插入到新表中,您只需要批量刪除想要刪除的內容。我建議你認真考慮歷史數據的歸檔表。 – rwking

0

如果可能的話,您已經發布的使用while循環迭代並刪除行的腳本應該更改爲基於集合的操作。關係數據庫引擎擅長基於數據集的操作,比如

Delete dbo.table WHERE yourcolumn = 5

,而不是在同一時間通過一個迭代。特別是如果它將用於上面評論中指出的「數百萬」行。

+0

儘管有數百萬條記錄?這可能會破壞事務日誌。 http://sqlperformance.com/2013/03/io-subsystem/chunk-deletes – rwking