孔夫子*_*孔夫子 12 database-design sql-server sql-server-2012
我们有这个打算“缩小”的大型数据库(> 1TB)。数据库围绕一个主要实体,我们称之为“访问”。为了讨论,假设它是一个医疗实践的数据库。
共有30个访问“类型”,例如程序、年度、随访、免疫等,每个访问“类型”都是“访问”的子表,例如“visit_immuno”。
该数据库自 2000 年以来已经积累了大约 12 年的数据。有人建议我们将大约 3 年的数据保留在“实时”版本中,而将其余的数据保留在“旧数据”数据库中。日期仅存储在“访问”表中,因为它是标准化的。Visit 表还包含一个ROWVERSION列和一个BIGINT伪标识(集群)列。出于所有意图和目的,假设集群键由 SEQUENCE (SQL Server 2012 Enterprise) 填充 - 我们将其命名为cid。
在visit.date当医生的推移延长探视,并与他的数据的“公文包”的回报并不总是以相同的顺序作为聚集键,例如,它被合并到主表。“访问”表也有一些更新,这将导致ROWVERSION列与cid和date列不同步- 简单地说,由于这个原因,ROWVERSION也cid不会制作合适的分区键。
从“实时”中删除数据的业务规则是visit.date必须大于 36 个月并且visit_payment必须存在子记录。此外,“old_data”数据库不包含任何基表,除了visit%.
所以我们最终得到:
直播DB(日常使用) -所有表老数据DB -对于较旧的数据visit%表
该提案要求一个组合数据库,它是一个外壳,其中包含(除外)中所有基表的同义词以及跨两个数据库中的表联合所有的视图。Live DBvisit%visit%
假设在Old-Data数据库中创建了相同的索引,查询会在 UNION-ALL视图上表现良好吗?什么类型的查询模式可能会影响 UNION-ALL视图的执行计划?
小智 -1
我们所做的方式是将旧数据批量写入到新创建的数据库中,并从live db中删除旧数据。这样两个数据库都可以访问。您还可以备份新创建的数据库并将其还原到其他位置,以消除生产服务器的大量占用空间。希望这是满足您需求的可接受的解决方案。