SQL 服务器:水平分区与外键
SQL Server: Horizontal Partitioning vs. Foreign Keys
所以我最近开始为一个老客户工作。他们有一个现有的数据库,他们希望我在他们的开发数据库中设置一个分区方案,以便他们可以看到它对性能的影响。 (他们认为通过将旧数据移动到另一个分区可以提高 "archive" 旧数据的性能。根据我的分析,我认为性能不会有任何显着提高。但他们希望我继续前进,无论如何。)所以我遇到了 TableA
和 TableB
具有多对多关系的情况。他们之间的Join table,我们称之为TableJ
.
TableA
在 uniqueidentifier
列上有一个聚簇主键。因此 TableJ
有一个引用 TableA.IDColumn
.
的外键约束
所以这是我的困境...为了在分区列上分区 TableA
(我们称之为 PartCol
)PartCol
需要包含在聚簇索引中.我的计划是删除 IDColumn
上的聚簇主键并将其替换为 PartCol
和 IDColumn
上的非聚簇主键,然后在 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 约束分区。
我不打算将其标记为答案,但是,因为我不是特别喜欢它并且希望其他人有更好的解决方案。
所以我最近开始为一个老客户工作。他们有一个现有的数据库,他们希望我在他们的开发数据库中设置一个分区方案,以便他们可以看到它对性能的影响。 (他们认为通过将旧数据移动到另一个分区可以提高 "archive" 旧数据的性能。根据我的分析,我认为性能不会有任何显着提高。但他们希望我继续前进,无论如何。)所以我遇到了 TableA
和 TableB
具有多对多关系的情况。他们之间的Join table,我们称之为TableJ
.
TableA
在 uniqueidentifier
列上有一个聚簇主键。因此 TableJ
有一个引用 TableA.IDColumn
.
所以这是我的困境...为了在分区列上分区 TableA
(我们称之为 PartCol
)PartCol
需要包含在聚簇索引中.我的计划是删除 IDColumn
上的聚簇主键并将其替换为 PartCol
和 IDColumn
上的非聚簇主键,然后在 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 约束分区。
我不打算将其标记为答案,但是,因为我不是特别喜欢它并且希望其他人有更好的解决方案。