【问题标题】:SQL Server: Horizontal Partitioning vs. Foreign KeysSQL Server:水平分区与外键
【发布时间】:2015-01-27 01:52:24
【问题描述】:

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

TableAuniqueidentifier 列上有一个聚集主键。所以TableJ 有一个引用TableA.IDColumn 的外键约束。

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

Msg 1776, Level 16, State 0, Line 1 没有主要或候选 引用表“MySchema.TableA”中与 引用外键“FK_TableJ_TableA”中的列列表。

这是有道理的,因为我的密钥不再被定义为在 IDColumn 上是唯一的。由于分区的工作方式,我不能有一个不包括分区列的唯一约束。但如果是这种情况,那么我如何支持具有 M 对 M 关系的表,例如这些?在我看来,这将是一个普遍的问题。所以我猜有一个我忽略的解决方案。

谢谢,提前。

附加说明,以防人们需要知道:这些表中最大的有 20M+ 记录。不是大到需要实现分区,但也不是小到可以立即断定这是不明智的。另外,我有大约 20 个表,我将尝试在这些表上实现分区。这是针对 SQL Server 2008 R2 的。

【问题讨论】:

    标签: sql-server-2008 foreign-keys partitioning


    【解决方案1】:

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

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

    【讨论】:

    • 好的,经过大量研究,我已经确认(至少令我满意)这是我最好的解决方案。对 OLTP 数据库进行分区似乎经常遇到这个问题。并且使用非对齐索引(这会阻止切换分区的能力)是拥有不包含分区列的唯一索引的唯一方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多