分区键也必须是主键的一部分吗?


24

我正在根据不是主键的列对表进行分区?我今天读到了一些有关分区列是否必须是主键一部分的信息。我的直觉说不,但我不确定100%。所以问题...

  1. 分区列是否必须是主列的一部分?是推荐一种方法还是另一种方法?
  2. 我是否必须为分区键创建索引,还是DBMS自己自动创建索引?

Answers:


11

一点也不。

最常见的分区方案之一是使用日期字段,该日期字段与PK完全无关。

例如,如果您有一个Orders包含字段的表,则OrderDate很可能根据的月份和年份进行分区OrderDate

当记录过期且不再相关时,您可以将这些分区移至存档表或数据库,以便不再对其进行处理。

分区几乎可以在任何字段中使用,但是为了使其正常工作,您要分区的字段应该用于大多数(如果不是全部)查询中。如果您不包括分区键,那么本质上您将获得跨多个表(分区)的昂贵的表扫描。

编辑

对于第二部分,我认为答案也不是。分区键用于确定将行放入哪个分区,但我认为不维护索引。虽然在后端可能有统计数据。


10
我知道这很老了,但它使我走错了路,所以我想我会为他人发表评论。如果要使用分区功能的SWITCH功能,分区列必须在主键中。如果它不在主键中,则会出现以下错误: Partition columns for a unique index must be a subset of the index key.
Vaccano

我同意@Vaccano
SAN

3

除了JNK的答案外,您可能还应该阅读本文该文章讨论了对齐表分区和索引分区。

在很多情况下,分区方案确实紧跟主键的第一列-例如,在数据仓库场景中,事实表的快照日期通常是分区列以及主键中的第一列。

但是同样地,在PK是IDENTITY或其他代理密钥的OLTP环境中,将其用于分区几乎没有意义,因为按任意数字进行分区通常不是非常有用。在OLTP系统中,您也倾向于按日期划分最多的分区(可能不在PK中),但也有可能按区域划分或按某种组织划分(如果您不使用代理,则可能在PK中划分)。

但这不是必需的。


好吧,不需要很多东西。甚至没有索引!为了在功能上有意义,必须在候选键的前导列上进行分区。否则,应用程序架构师将如何使用该表?
srini.venigalla 2012年

@ srini.venigalla这是一个常见的情况,但是另一个常见的情况(是否也是如此)是对根本不属于主键或候选键的某些部分进行分区-因为分区通常用于归档,因此可以将有效期定为一个很好的分区选择。但是没有什么暗示这可能是密钥的一部分。分区是一个很低级的功能,非常通用,这里至少存在两种​​截然不同且相互冲突的使用模式,这两种模式都具有合理的最佳实践。
Cade Roux 2012年

0

如果不是主键本身的一部分,它必须是候选键的一部分。想法是,您的分区应与主键对齐。

因此,答案是肯定的,它是PK的一部分。如果不是另一个密钥,那么它同样足以成为PK。


从未听说过候选键。如何在“创建/更改”表语句中指定它?
AngryHacker 2012年

候选密钥只是有资格成为主密钥的另一个密钥。例如,ID是主键。但是在同一个表中,如果另一列例如。PERSON_ID还可以唯一地标识一行,称为候选键。第二和第三规范化规则也应针对所有候选密钥。
srini.venigalla 2012年

明白了 那我的问题的第二部分呢?
AngryHacker 2012年

与任何其他索引相同。示例:CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor(BusinessEntityID);
srini.venigalla

4
这是绝对不正确的。您可以在根本不与PK相关的许多字段上进行分区,例如OrderDate。您有什么要支持您的主张的吗?
JNK 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.