Sql-Server

如何將模式與數據庫的其餘部分分開,使其不鎖定?

  • September 22, 2020

我們正在使用一個專有的 SQL Server 2012 數據庫,該數據庫來自一家公司,該公司為其表、視圖、對像等提供了模式名稱 - 我們將其稱為 COMP,用於“公司的”模式。

作為客戶,我們可以通過 SSMS 完全訪問公司的數據庫結構,並完全控制它的各個方面。但是,為了讓我們根據需要自定義數據庫,我們為“我們的內部”模式創建了一個名為 INT 的單獨模式。我們的新表、視圖等都在這個模式下,每個人都很高興

但是,我們的“INT”模式有一個我們似乎執行的小時工作(尚未確認),以鎖定整個數據庫,包括公司的模式和結構。這實際上會在使用者端鎖定應用程序至少 3 到 5 分鐘。一些使用者已經註意到這一點並開始提出投訴。

我們的 INT 模式中的一些視圖確實引用了 COMP 模式表和對象。這可能是它鎖定一切的原因嗎?有沒有辦法將我們的模式與對象的 COMP 模式分開,這樣它就不會將伺服器鎖定或占用所有使用者?請問是否有關於如何執行上述操作的最佳實踐?

從評論執行緒中挑選,嘗試總結並提供一些建議:

Schema 只是一個邏輯結構——它沒有任何物理意義。因此,從鎖定的角度來看,將您的東西放在相同或不同的模式中沒有區別。例如,如果您有引用 prod 中表的視圖,並通過視圖進行修改,那麼鎖將應用於基表。這裡有幾個選項,但架構不是其中之一。

話雖如此,如果您決定在該數據庫中創建對象,那麼擁有一個單獨的模式可能會因為阻塞之外的*其他原因而變得更好。*例如,通過模式更容易看到您創建了哪些對象。

我們很難說哪種方案能最好地解除阻塞,因為我們幾乎不知道你在做什麼。

我喜歡 KISS 原則,所以如果您只是讀取數據,並且可以接受一天前的數據,那麼請考慮備份和恢復(進入新的“報告”數據庫)。

或者,僅將您需要的內容複製到新表中(可能複製到新數據庫中)。這可能是一個代理工作。如果要使用增量,您可以研究更改數據擷取 (CDC) 和更改跟踪 (CT) 等功能。通常,您獲得的花哨越多,您花在開發上的時間就越多。

如果您不想使用生產數據的副本,那麼我們真的需要知道您在做什麼。調查是否允許使用快照隔離級別(數據庫設置)。您的程式碼將使用 SNAPSHOT 隔離級別並減少阻塞的可能性。但是由於現在必須將舊版本的行儲存在 tempdb 中(以允許讀取器獲取該行的先前版本),因此您將在數據庫中使用更多的資源。

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