Sql-Server
分區切換與模式傳輸
我正在設計一個數據庫,其數據將由 ETL 每天生成。經過一番研究,我發現可以使用分區切換或模式傳輸來最大化“實時”數據的正常執行時間。僅出於資訊完整性考慮,此數據庫將部署在 Azure SQL 數據庫上,並在 Docker 上的 SQL Server 2019 開發人員版上進行開發。它包含約 20 個表,每個表的行數少於 10M(預期)。
所以現在在我的設計中有兩種模式:
[App]
:包含多個表(沒有外鍵)以及應用程序使用的實時數據。[AppShadow]
:包含與模式完全相同的表[App]
(但帶有外鍵),通常為空,用作 ETL 的目標。我的流程如下所示:
[AppShadow]
使用模式中的表作為目標執行 ETL 。外鍵確保我的數據是一致的。set transaction isolation level serializable; begin transaction;
[AppShadow]
使用禁用架構中表的所有約束alter table [AppShadow].[<table_name>] nockeck constraint all;
- 截斷
[App]
模式中的所有表- 將所有表的分區從 切換
[AppShadow]
到[App]
- 使用重新啟用
[AppShadow]
架構中表的所有約束alter table [AppShadow].[<table_name>] with check check constraint all;
commit transaction;
該解決方案似乎工作正常,停機時間最短,但我無法弄清楚使用
[Swap]
模式和alter schema <schema_name> transfer <table_name>
語句在模式之間傳輸整個表的任何優點或缺點。SQL Server 是 SQL Server,我很確定有一些我不知道的隱藏警告應該讓我更喜歡一個解決方案。你有什麼意見或建議嗎?
你有什麼意見或建議嗎?
您描述的所有操作都是元數據,所以我不希望性能有任何顯著差異。
奇怪的是你沒有外鍵
$$ App $$架構。您已經支付了檢查 DRI 的費用,並且如果您在數據庫中驗證了外鍵,則查詢優化器可以利用它們。 模式轉移將允許您將所有外鍵留在原地。