2010-03-05 73 views
16

如何從SQL Server 2005表中刪除記錄而不記錄到事務日誌中。刪除不記錄日誌的SQL Server 2005記錄

我不想記錄,因爲一旦刪除,那些記錄將不再需要。

目前各種刪除操作需要花費太多時間。還有其他選項可以提高刪除語句的性能嗎?我不能使用truncate,因爲有一個where子句需要。

+1

嗯,有趣的...你保持比你刪除?或更少? – 2010-03-05 05:46:37

+0

不知道。但在大多數情況下,我保持較少和刪除更多。從許多表格中刪除的記錄數量太多了。事實上,這是一個清除常規。 – 2010-03-05 05:50:53

+2

在這種情況下,查看是否可以將「保留」插入到臨時表中,截斷主表並將其重新插入主表中,可能會很有趣。 (你可能需要做一些奇怪的事情來維護身份等,但它可能值得一試,但我懷疑有人可能有一個更好的主意)。 – 2010-03-05 05:52:45

回答

4

如果要刪除你的整個表可以使用TRUNCATE TABLE,它只記錄頁面釋放,而不是每個行都刪除一個條目我不知道有什麼辦法可以在沒有任何事務日誌的情況下執行刪除操作

+3

'TRUNCATE TABLE'從表格中刪除*全部*記錄 – 2010-03-05 06:06:53

+0

那麼,那些仍然需要的可以存儲在臨時表中;)移回到現在空的表中。 – TomTom 2010-10-29 09:29:34

+0

如果表具有外鍵約束,則截斷表將不起作用。 – Marques 2014-03-28 19:30:39

0

你正在刪除東西,但是你有一個where子句,所以關於SQL的常用性能建議適用。

您是否使用SQL分析器查看請求的執行計劃?如果您記錄這些操作,則可以使用性能嚮導來分析它們,並可能建議一個新的索引。

如果你做了很多單獨的刪除語句(delete ... where id = xxx),你最好創建一個包含所有ID的臨時表並且加入這個臨時表來獲得一條刪除語句。

6

我認爲你是混淆了數據庫中的事務日誌的概念。事務日誌的主要功能不是用於恢復舊行 - 它的工作是維護數據庫的一致性。所有修改都通過事務日誌,並且沒有辦法解決。這是好事。事務日誌還用於對數據庫進行時間點備份和還原,並在兩臺服務器之間進行鏡像時使用。

如果您刪除的時間過長,您應該首先查看幾個區域。

1)你有任何DELETE觸發器在你的表上觸發嗎?如果是這樣,那可能是一個緩慢的來源。

2)您的DBA是否正確設置了數據庫,至少保持事務日誌和數據文件位於不同的物理磁盤上?

3)你有很多外鍵正在檢查?例如,如果您有另一個引用要刪除表的表,那麼數據庫服務器將根據引用表檢查每個刪除,以確保刪除語句不會導致其他表不一致。

4)您是否有太多的索引,或者索引負擔過重?每個刪除的行都將與每個索引中的條目相對應,因此請謹慎使用索引。您的索引是否妥善維護?

5)查找要刪除的行是否需要很長時間?如果您的DELETE語句中的WHERE子句過於昂貴,那麼這會真的減慢您的刪除速度。嘗試臨時將DELETE語句更改爲SELECT語句,並查看該查詢是否運行得很快。如果沒有,您應該優化您的SELECT語句,方法是編輯它,重構您的表,或者添加相應的索引。然後將該語句更改回DELETE。如果在優化期間相應的SELECT語句的執行得到改進,性能應該會得到顯着提高。

如果您有一個大批量作業對您的表執行大量刪除操作,您可能需要暫時禁用觸發器,或者您可能希望在這些大批量刪除操作後刪除並重新創建索引和外鍵。這也可能會加快速度。

4

忘記事務日誌作爲速度的來源或除數據庫內部使用的其他內容以保持一致性之外的任何事情。相反,你應該考慮找到一種方法來批量刪除。而不是單個刪除語句,並且如果您在表上有一個整數PK,請嘗試刪除值的範圍並在循環中執行此操作。因此,像

Declare @RecordsLeft int 
Declare @StartRange int 
Declare @EndRange int 
Declare @BatchSize int 

Set @BatchSize = 10000 
Set @RecordsLeft = (Select Count(*) From ...) 
Set @StartRange = 0 
Set @EndRange = @StartRange + @BatchSize 

While @RecordsLeft > 0 
Begin 
    Delete ... 
    Where ... 
     And PK Between @StartRange And @EndRange 

    Set @RecordsLeft = (Select Count(*) From ...) 
    Set @StartRange = @EndRange + 1 
    Set @EndRange = @StartRange + @BatchSize 
End 
+0

它的工作。謝謝。 – fkucukbaltaci 2011-03-20 18:33:38

16

這很容易:

DECLARE @BatchSize INT 
SET @BatchSize = 100000 

WHILE @BatchSize <> 0 
BEGIN 
    DELETE TOP (@BatchSize) 
    FROM [dbo].[UnknownTable] 
    SET @BatchSize = @@rowcount 
END 
+0

很好的解決方案,以防您沒有TRUNCATE TABLE權限,謝謝! – 2012-07-10 15:29:53

+0

任何人都可以確認(或駁斥)這是**實際**解決方案嗎?我對此非常懷疑,我不認爲'TOP'會停止每個被刪除的記錄被記錄... – MarioDS 2014-09-24 12:11:43

+0

這裏 - http://dba.stackexchange.com/a/1751是大致相同的解決方案,但更多一點compact – sarh 2015-03-05 13:30:55

2

只是試圖通過之前和DELETE語句後,將這些語句刪除記錄。 traceon(610)traceoff(610)。它是這樣的

dbcc traceon(610) 

--Your Delete Statement 
delete statement 


dbcc traceoff(610) 
+0

看起來像610跟蹤標誌是不相關的sql 2005.語句「工作」沒有失敗,但沒有結果。 – sarh 2015-03-05 13:28:11

相關問題