Sql-Server

阻塞寫入器時 SELECT 語句的 TABLOCK 提示不是問題

  • June 22, 2021

由於 SELECT 語句與 X 和 U 相比採用共享鎖,因此在我看來,在用於報告的數據倉庫樣式查詢中使用 WITH(TABLOCK) 是正確的做法,以避免鎖管理和鎖升級。

我說的是數據不是實時生產數據並且並發不是問題的情況。例如,我不關心通過獲取共享表鎖來阻塞作者。當然我不想阻塞讀者,但是 S 鎖不會阻塞其他讀者。

所以我想我可以將我的問題表述為:在數據倉庫環境中,是否所有查詢都不應使用 WITH (TABLOCK) 進行提示?從理論上講,這應該會提高性能。如果不是,為什麼?

謝謝

如果您擔心獲取鎖,請考慮改用已送出的讀快照隔離快照隔離。這些在讀取時使用行版本控製而不是共享鎖。如果對數據庫的更改很少,則沒有理由偏愛您的解決方案。

最終,如果數據庫完全不變,則可以將其設置為只讀。在這種情況下,無論請求的隔離級別如何,SQL Server 都不會使用任何鎖。在將數據庫設置為只讀之前,還需要考慮其他事項,例如創建統計資訊。有關更多詳細資訊,請參閱文件

向每個查詢添加表鎖提示在技術上是合理的,但我懷疑它在許多情況下是最佳解決方案。如果你想改變你的安排,你必須做出很多改變。

文件:事務鎖定和行版本控制指南

引用自:https://dba.stackexchange.com/questions/294560