如何從SQL Server 2005表中刪除記錄而不記錄到事務日誌中。刪除不記錄日誌的SQL Server 2005記錄
我不想記錄,因爲一旦刪除,那些記錄將不再需要。
目前各種刪除操作需要花費太多時間。還有其他選項可以提高刪除語句的性能嗎?我不能使用truncate,因爲有一個where子句需要。
如何從SQL Server 2005表中刪除記錄而不記錄到事務日誌中。刪除不記錄日誌的SQL Server 2005記錄
我不想記錄,因爲一旦刪除,那些記錄將不再需要。
目前各種刪除操作需要花費太多時間。還有其他選項可以提高刪除語句的性能嗎?我不能使用truncate,因爲有一個where子句需要。
首先,請注意,您不能擁有一個事務日誌..如果您在執行大量刪除操作時在服務器中斷電,該怎麼辦?需要此信息,以便SQL Server可以執行atomic operations ..
可能是你的興趣是什麼,雖然是「恢復模式」請閱讀此文章TechNet上:http://technet.microsoft.com/en-us/library/ms189275.aspx
你正在刪除東西,但是你有一個where子句,所以關於SQL的常用性能建議適用。
您是否使用SQL分析器查看請求的執行計劃?如果您記錄這些操作,則可以使用性能嚮導來分析它們,並可能建議一個新的索引。
如果你做了很多單獨的刪除語句(delete ... where id = xxx),你最好創建一個包含所有ID的臨時表並且加入這個臨時表來獲得一條刪除語句。
我認爲你是混淆了數據庫中的事務日誌的概念。事務日誌的主要功能不是用於恢復舊行 - 它的工作是維護數據庫的一致性。所有修改都通過事務日誌,並且沒有辦法解決。這是好事。事務日誌還用於對數據庫進行時間點備份和還原,並在兩臺服務器之間進行鏡像時使用。
如果您刪除的時間過長,您應該首先查看幾個區域。
1)你有任何DELETE觸發器在你的表上觸發嗎?如果是這樣,那可能是一個緩慢的來源。
2)您的DBA是否正確設置了數據庫,至少保持事務日誌和數據文件位於不同的物理磁盤上?
3)你有很多外鍵正在檢查?例如,如果您有另一個引用要刪除表的表,那麼數據庫服務器將根據引用表檢查每個刪除,以確保刪除語句不會導致其他表不一致。
4)您是否有太多的索引,或者索引負擔過重?每個刪除的行都將與每個索引中的條目相對應,因此請謹慎使用索引。您的索引是否妥善維護?
5)查找要刪除的行是否需要很長時間?如果您的DELETE語句中的WHERE子句過於昂貴,那麼這會真的減慢您的刪除速度。嘗試臨時將DELETE語句更改爲SELECT語句,並查看該查詢是否運行得很快。如果沒有,您應該優化您的SELECT語句,方法是編輯它,重構您的表,或者添加相應的索引。然後將該語句更改回DELETE。如果在優化期間相應的SELECT語句的執行得到改進,性能應該會得到顯着提高。
如果您有一個大批量作業對您的表執行大量刪除操作,您可能需要暫時禁用觸發器,或者您可能希望在這些大批量刪除操作後刪除並重新創建索引和外鍵。這也可能會加快速度。
忘記事務日誌作爲速度的來源或除數據庫內部使用的其他內容以保持一致性之外的任何事情。相反,你應該考慮找到一種方法來批量刪除。而不是單個刪除語句,並且如果您在表上有一個整數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
它的工作。謝謝。 – fkucukbaltaci 2011-03-20 18:33:38
這很容易:
DECLARE @BatchSize INT
SET @BatchSize = 100000
WHILE @BatchSize <> 0
BEGIN
DELETE TOP (@BatchSize)
FROM [dbo].[UnknownTable]
SET @BatchSize = @@rowcount
END
只是試圖通過之前和DELETE語句後,將這些語句刪除記錄。 traceon(610)
和traceoff(610)
。它是這樣的
dbcc traceon(610)
--Your Delete Statement
delete statement
dbcc traceoff(610)
看起來像610跟蹤標誌是不相關的sql 2005.語句「工作」沒有失敗,但沒有結果。 – sarh 2015-03-05 13:28:11
嗯,有趣的...你保持比你刪除?或更少? – 2010-03-05 05:46:37
不知道。但在大多數情況下,我保持較少和刪除更多。從許多表格中刪除的記錄數量太多了。事實上,這是一個清除常規。 – 2010-03-05 05:50:53
在這種情況下,查看是否可以將「保留」插入到臨時表中,截斷主表並將其重新插入主表中,可能會很有趣。 (你可能需要做一些奇怪的事情來維護身份等,但它可能值得一試,但我懷疑有人可能有一個更好的主意)。 – 2010-03-05 05:52:45