對性能影響有限的 SQL Server 數據提取
背景:
我有一個包含三個表的 SQL Server 2008 企業版數據庫。這些表分別包含約 300 萬、約 1400 萬、約 1450 萬行。
問題:
我需要從數據庫中提取數據以進行報告。這將涉及連接三個表並將每一行寫入文本文件。該數據庫目前正在佔用生產流量,我想限制性能影響。此數據提取不應阻止在此過程中發生讀取、寫入或更新。
根據我所做的研究,我相信在數據提取查詢中添加“NOLOCK”提示將使生產流量正常執行,同時仍完成我的數據提取主要任務。我假設與“NOLOCK”提示相關的髒讀將被隔離到數據提取查詢中。
我是否正確假設數據提取查詢上的“NOLOCK”提示只會影響一個特定的查詢?在執行數據提取查詢時,它是否會影響正在數據庫上執行的所有查詢?
有沒有比我上面介紹的更好的方法來實現我的目標?
您可以通過多種方式處理這種情況。
我需要從數據庫中提取數據以進行報告。
- 如果您希望不經常執行此操作並進行數據靜態報告,則備份還原方法最適合。
- 數據庫快照僅是企業版功能,它還為您提供了數據庫的靜態時間點視圖。
請注意,數據庫快照會佔用磁碟空間,過多會填滿磁碟空間,尤其是在數據更新頻繁的生產環境中。此外,使用數據庫快照會稍微降低性能,因為在執行寫入操作時會複製數據頁,從而增加了數據庫上的 I/O。
請參閱Microsoft SQL Server 數據庫快照和同義詞以克服快照具有的一些限制和解決方法。
- 如果您想要接近實時報告並希望從主伺服器上解除安裝報告工作,請查看 Replication,尤其是T-Rep 。T-Rep 將為您提供事務一致性、低延遲、高吞吐量、最小成本以及過濾行的能力的好處。
- 最後,如果沒有一個選項對您來說是可行的,那麼通過適當的測試考慮將數據庫的隔離級別更改為 RCSI(讀取送出快照隔離)。這將以TEMPDB性能為代價。
-- check if RCSI is enabled SELECT name, is_read_committed_snapshot_on FROM sys.databases WHERE name = '<dbname>' -- Enable RCSI ALTER DATABASE <dbname> SET READ_COMMITTED_SNAPSHOT ON
來自數據載入性能指南:
RCSI 基本上會防止讀取數據的查詢阻塞或被修改同一張表中數據的其他查詢阻塞。它是 NOLOCK 的強大替代方案,因為它保證數據的完整、事務一致的視圖並且不需要特殊提示。雖然 RCSI 最初針對的是 OLTP 工作負載常見的場景,但該功能可以成為數據倉庫工作負載或涉及大規模批量插入操作的場景中的強大工具。
RCSI 作為數據庫範圍的設置啟用。啟用後,讀取器查詢不會獲取行、頁或表上的共享鎖,因此它們不會被其他人使用的 X 或 BU 鎖阻塞。相反,表中的新行或修改行帶有一個 17 字節的版本標識符,並且使用 SQL Server 中的行版本控制機制將被事務更改(更新或刪除)的任何行的前映像複製到 tempdb。讀取器查詢僅考慮在查詢開始時送出的那些行——通過忽略任何更高的版本號並為適當的早期版本的行引用 tempdb。
另請閱讀:將不同的結果與 RCSI 和SQL CAT 團隊送出的讀取進行比較。
最後,要觸及 NOLOCK 提示,我建議您閱讀