AngryHacker Asked: 2012-07-10 13:01:32 +0800 CST2012-07-10 13:01:32 +0800 CST 2012-07-10 13:01:32 +0800 CST 分区键是否也必须是主键的一部分? 772 我正在根据不是主键的列对表进行分区?我今天阅读了一些关于分区列是否必须是主键的一部分的相互矛盾的信息。我的直觉说不,但我不是 100% 确定。那么问题... 分区列必须是主列的一部分吗?是推荐一种方式还是另一种方式? 我是否必须为分区键创建索引,还是 DBMS 自己自动创建? sql-server sql-server-2008 3 个回答 Voted Best Answer JNK 2012-07-11T09:51:33+08:002012-07-11T09:51:33+08:00 一点也不。 分区最常见的场景之一是使用与您的 PK 完全无关的日期字段。 例如,如果您有一个Orders包含字段的表,OrderDate您很可能会根据OrderDate. 当记录过期并且不再相关时,您可以将这些分区移至存档表或数据库,以便不再处理它们。 分区几乎适用于任何字段,但为了使其正常工作,您分区的字段应该在大多数(如果不是全部)查询中使用。如果您不包括分区键,那么您将获得跨越多个表(分区)的昂贵的表扫描。 编辑 对于第 2 部分,我认为答案是否定的。分区键用于确定将行放入哪个分区,但我认为不会维护索引。不过,后端可能有统计信息。 Cade Roux 2012-07-11T10:09:27+08:002012-07-11T10:09:27+08:00 除了 JNK 的回答之外,您可能还应该阅读这篇讨论对齐表分区和索引分区的文章。 在许多类型的场景中,分区方案确实遵循主键的第一列 - 例如在数据仓库场景中,事实表的快照日期通常是分区列以及主键中的第一列。 但同样,在 PK 是 IDENTITY 或其他代理键的 OLTP 环境中,将其用于分区几乎没有意义,因为对任意数字进行分区通常不是非常有用。在 OLTP 系统中,您也最倾向于按日期进行分区(可能不在 PK 中),但也可能按区域或某种组织划分(如果您不使用代理,可能在 PK 中)。 但这不是一个要求。 srini.venigalla 2012-07-10T13:20:01+08:002012-07-10T13:20:01+08:00 如果不是主键本身的一部分,它必须是候选键的一部分。想法是,您的分区应该与主键对齐。 所以答案是,是的,最好是PK的一部分。如果不是另一个关键,这同样足以成为一个PK。
一点也不。
分区最常见的场景之一是使用与您的 PK 完全无关的日期字段。
例如,如果您有一个
Orders
包含字段的表,OrderDate
您很可能会根据OrderDate
.当记录过期并且不再相关时,您可以将这些分区移至存档表或数据库,以便不再处理它们。
分区几乎适用于任何字段,但为了使其正常工作,您分区的字段应该在大多数(如果不是全部)查询中使用。如果您不包括分区键,那么您将获得跨越多个表(分区)的昂贵的表扫描。
编辑
对于第 2 部分,我认为答案是否定的。分区键用于确定将行放入哪个分区,但我认为不会维护索引。不过,后端可能有统计信息。
除了 JNK 的回答之外,您可能还应该阅读这篇讨论对齐表分区和索引分区的文章。
在许多类型的场景中,分区方案确实遵循主键的第一列 - 例如在数据仓库场景中,事实表的快照日期通常是分区列以及主键中的第一列。
但同样,在 PK 是 IDENTITY 或其他代理键的 OLTP 环境中,将其用于分区几乎没有意义,因为对任意数字进行分区通常不是非常有用。在 OLTP 系统中,您也最倾向于按日期进行分区(可能不在 PK 中),但也可能按区域或某种组织划分(如果您不使用代理,可能在 PK 中)。
但这不是一个要求。
如果不是主键本身的一部分,它必须是候选键的一部分。想法是,您的分区应该与主键对齐。
所以答案是,是的,最好是PK的一部分。如果不是另一个关键,这同样足以成为一个PK。