簡體   English   中英

通過臨時表更新

[英]Update via a temp table

因此,我有一個很大的表(1.5億行),數據清理查詢每天晚上運行。 現在,這些查詢不會更新很多記錄,而是要獲取所需的記錄,這些記錄必須在子查詢中多次查詢單個表,這需要一些時間。

因此,對我來說,執行常規的update語句會更好,還是將一些所需的結果放入臨時表中,然后對這幾行進行更新會更好,這將大大減少鎖在更新期間。

我不確定大部分時間用於查詢時,更新語句如何鎖定。 如果只更新5條記錄,並且運行了半小時,它將發布在第一分鍾更新的記錄,還是等到查詢結束?

謝謝

您需要使用(並研究) ROWLOCK表提示。 您可以將其與update語句一起使用,同時以少於5000行的批量進行更新。 這將嘗試在目標表中(或如果存在覆蓋索引,則在索引鍵上)放置行鎖。 如果由於某種原因失敗,則該鎖將升級為表鎖。

從MSDN (作為可能導致鎖升級的原因):

當數據庫引擎檢查每1250個新獲取的鎖是否有可能升級時,只有且僅當Transact-SQL語句已在表的單個引用上獲取了至少5000個鎖時,才會發生鎖升級。 當Transact-SQL語句在表的單個引用上獲取至少5,000個鎖時,將觸發鎖升級。 例如,如果一條語句在同一表的一個索引中獲得3,000個鎖,而在另一個表中獲得3,000個鎖,則不會觸發鎖升級。 同樣,如果語句在表上具有自聯接,則不會觸發鎖升級,並且對表的每個引用僅在表中獲取3,000個鎖。

實際上,在上一篇文章中還有更多要閱讀的內容。 您應該查看混合鎖類型升級部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM