Sql-Server
阻塞寫入器時 SELECT 語句的 TABLOCK 提示不是問題
由於 SELECT 語句與 X 和 U 相比採用共享鎖,因此在我看來,在用於報告的數據倉庫樣式查詢中使用 WITH(TABLOCK) 是正確的做法,以避免鎖管理和鎖升級。
我說的是數據不是實時生產數據並且並發不是問題的情況。例如,我不關心通過獲取共享表鎖來阻塞作者。當然我不想阻塞讀者,但是 S 鎖不會阻塞其他讀者。
所以我想我可以將我的問題表述為:在數據倉庫環境中,是否所有查詢都不應使用 WITH (TABLOCK) 進行提示?從理論上講,這應該會提高性能。如果不是,為什麼?
謝謝
如果您擔心獲取鎖,請考慮改用已送出的讀快照隔離或快照隔離。這些在讀取時使用行版本控製而不是共享鎖。如果對數據庫的更改很少,則沒有理由偏愛您的解決方案。
最終,如果數據庫完全不變,則可以將其設置為只讀。在這種情況下,無論請求的隔離級別如何,SQL Server 都不會使用任何鎖。在將數據庫設置為只讀之前,還需要考慮其他事項,例如創建統計資訊。有關更多詳細資訊,請參閱文件。
向每個查詢添加表鎖提示在技術上是合理的,但我懷疑它在許多情況下是最佳解決方案。如果你想改變你的安排,你必須做出很多改變。
文件:事務鎖定和行版本控制指南