SQL 服务器:水平分区与外键

SQL Server: Horizontal Partitioning vs. Foreign Keys

所以我最近开始为一个老客户工作。他们有一个现有的数据库,他们希望我在他们的开发数据库中设置一个分区方案,以便他们可以看到它对性能的影响。 (他们认为通过将旧数据移动到另一个分区可以提高 "archive" 旧数据的性能。根据我的分析,我认为性能不会有任何显着提高。但他们希望我继续前进,无论如何。)所以我遇到了 TableATableB 具有多对多关系的情况。他们之间的Join table,我们称之为TableJ.

TableAuniqueidentifier 列上有一个聚簇主键。因此 TableJ 有一个引用 TableA.IDColumn.

的外键约束

所以这是我的困境...为了在分区列上分区 TableA(我们称之为 PartColPartCol 需要包含在聚簇索引中.我的计划是删除 IDColumn 上的聚簇主键并将其替换为 PartColIDColumn 上的非聚簇主键,然后在 PartCol 上创建聚簇索引以便建立水平分区。为了完成所有这些,我必须删除引用 TableA.IDColumn 的外键,然后在完成后重新创建它们。但是,当我尝试重新创建 FK 约束时,出现如下错误:

Msg 1776, Level 16, State 0, Line 1 There are no primary or candidate keys in the referenced table 'MySchema.TableA' that match the referencing column list in the foreign key 'FK_TableJ_TableA'.

这是有道理的,因为我的密钥不再被定义为在 IDColumn 上是唯一的。由于分区的工作方式,我不能有不包含分区列的唯一约束。但如果是这样的话,那么我如何支持 tables,像这样,有 M-to-M 关系?在我看来,这将是一个普遍的问题。所以我猜我忽略了一个解决方案。

提前致谢。

附加说明,以防人们需要知道:这些 table 中最大的有 2000 万条记录。没有大到 需要 实施分区,但也没有小到立即断定这是不明智的。此外,我将尝试在大约 20 table 上实现分区。这是 SQL Server 2008 R2。

好的,看起来我唯一的行动方案是在 [PRIMARY] 文件组而不是分区方案上创建我所有的唯一 indexes/constraints。 (因此使它们成为非对齐索引,如果我们决定实施分区切换,这将干扰分区切换。但在我的情况下,这似乎不是问题。)然后我可以像以前一样重建我的 FK 约束分区。

我不打算将其标记为答案,但是,因为我不是特别喜欢它并且希望其他人有更好的解决方案。