我正在編寫一個過程,用於刪除n天之前幾張表中的所有行。從SQL Server中刪除大量的行 - 以高效和非鎖定的方式
一個死簡單的查詢很容易編寫
DELETE FROM [myTable]
WHERE [Created] < GETDATE()-30
的一個問題是沒有對日期字段沒有索引 - 我可以添加一個,但我的工作圍繞它做類似:
SELECT @var = MAX([ID]) FROM myTable WHERE Created < GETDATE()-30;
DELETE FROM myTable WHERE ID < @var
這似乎是一個可接受的方法嗎?
問題是表是巨大的,而且這個查詢將會刪除每次運行可能有幾十萬行。
在一個(稍慢)的測試服務器上運行它需要一個小時左右的時間,並從試圖讀取/寫入其他進程的表中查殺表。
我並不太在乎它需要一段時間才能運行(雖然速度更快) - 但是我不能讓它在運行時將表鎖定一個小時,因爲存在不斷的讀/寫操作(主要是寫)。
我的數據庫知識是相當基本的,因爲我是一個編碼員而不是dba。
有人可以給我一個體面的方法來執行此任務 - 以最有效的方式。
爲什麼不簡單地選擇要刪除到臨時表中的記錄,然後創建一個遊標以刪除每次運行中臨時表中的幾條記錄?然後你有很多小的刪除語句不應該鎖定你的表。 – Tejs 2011-05-05 21:58:17
刪除舊的分區。如果你沒有分區,你應該看看... – peufeu 2011-05-05 22:11:19