我正在设计一个数据库,其数据将由 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 的费用,并且如果您在数据库中验证了外键,则查询优化器可以利用它们。
模式转移将允许您将所有外键留在原地。