Sql-Server

在數據庫級別設置隔離級別

  • September 3, 2018

我們有一個數據倉庫,每晚都會被刪除和複製。我們有很多使用倉庫的 SSRS 報告。有時 SSRS 報告出錯並且永遠不會執行,從而防止我們的倉庫被填滿。

我可以輕鬆地進行臟讀(無論如何數據都不會改變),所以我發現我們可以進入READ UNCOMMITTED事務級別。現在我遇到了一個我簡直不敢相信的問題:

難道真的不能改變數據庫的預設隔離級別嗎?那會是什麼原因呢?

這沒有任何意義。我希望我的預設隔離級別為READ UNCOMMITTED. 我真的不想去每個 SSRS 報告並單獨設置它的事務隔離級別。我們有很多很多 SSRS 報告。

我可以啟用 RCSI,但它只會不必要地減慢數據庫速度。以這種方式處理報告幾乎是不可能的。我們有很多寫得很糟糕的 SSRS 報告(在圖形設計器中……),我們沒有時間修復它們。

當我有大量空閒時間時,我會經歷這個過程,但這並不經常發生。倉庫裝滿對我們來說是一個非常嚴重的問題。目前,我們所有的問題都可以通過更改預設隔離級別來解決。

  • 數據倉庫在晚上無人使用時被填滿
  • 全天沒有數據進入 DW,我們使用離線數據最多 -1 天。

所以在我們的模型中,實際上沒有並發的讀寫,除非查詢被卡住並且有人忘記了它並讓它試圖執行。

有什麼解決辦法嗎?

有比臟讀更好的方法來處理這個問題。READ UNCOMMITTED 查詢仍然會阻塞DDL,比如 TRUNCATE TABLE、DROP TABLE 和 ALTER TABLE … SWITCH,所以它甚至可能沒有幫助。

首先,當然是 RCSI,它是同時載入和讀取數據庫(甚至是數據倉庫)的基本正確解決方案。它不會不必要地減慢您的負載。它執行啟用並發讀取器和寫入器*所需的操作。*RCSI 只為 UPDATE 和 DELETE 創建行版本。除非表有觸發器,否則 INSERT 不會生成行版本。

其次,如果您想在報表執行 READ UNCOMMITTED 時重新載入數據倉庫,它們會得到錯誤的結果。因此,您不妨 KILL 連接的會話,或者擁有您的 ETL 工作alter database current set single_user with rollback immediate

第三,您可以在執行 ETL 時使用數據庫快照來保持 DW 可用於讀取。您還可以使用快照回滾(恢復)失敗的 ETL 流程,即使它沒有在單個事務中執行。

SQL Server 中的事務隔離級別和(數據庫)快照隔離之間存在差異。(微軟文件)

讀取臟數據和根本不讀取數據之間存在很大差異(正如大衛布朗在他的回答中已經指出的那樣)。

您可能必須重新設計整個 DW 解決方案,以確保您可以在特定時間範圍內載入/解除安裝,並且仍然保持 Reporting Services 幾乎無縫的可用性。隨著您的負載增加(使用者和數據),對新解決方案的需求也將增加。

您可能必須使您的業務需求適應您環境的功能。如果您的環境不符合您的(業務)要求,那麼您可能需要投資於更好的環境:

  • 可用性組

    • 同步
    • 非同步
    • 只讀

您甚至可能不得不重新考慮您的 ETL 策略。為什麼不做 ELT 呢?

我會與您的企業討論以確定他們的要求,然後可能會與您信任的顧問討論,以便您實施可行的解決方案。

最後,這一切都取決於您的業務需求和可用資源。

“你不能用火柴棍建造一個 Sojus 發射台,並期望它能夠到達它的軌道。”

                                                                                                                                - 未知

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