PK上的压缩与表上的压缩之间有什么区别?


9

可以在表上设置数据压缩:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 )
) ON SomePartitionScheme(SomeId) WITH (DATA_COMPRESSION=PAGE)

可以在主键上定义它:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 ) WITH (DATA_COMPRESSION=PAGE)
) ON SomePartitionScheme(SomeId) 

但是,如果将它们放在两者上,则会出现此错误:

为该表指定了DATA_COMPRESSION选项,如果对表进行了分区,则至少为其一个分区指定了DATA_COMPRESSION选项。

将其放在PK和桌面上有什么区别吗?


您是否认为如果主键不是表的集群列会有所不同吗?:)
LowlyDBA 2015年

1
@JohnM:我想是的,但我不知道。(这就是我问的原因:)
Vaccano 2015年

Answers:


14

不是将压缩放在主键上,而是将压缩放在聚簇索引上。对于SQL Server,聚集索引正在组织该索引上表的物理结构。或者,简而言之,聚集索引就是表。这意味着压缩聚簇索引和压缩表在功能上是等效的。如果要将主键创建为非聚集索引并将基本表保留为堆,则这两个结构将有所不同并分别进行压缩。


如果您无视所有合理性而将主键设置为非聚集索引并创建了另一个聚集索引怎么办?压缩会再次相同吗?
Ross Presser 2015年

1
不会的。不要在这里考虑主键,这是无关紧要的。在这里,我们需要专注于聚集和非聚集索引。您不能分别压缩聚簇索引和表,因为它们是同一对象。聚集索引/表和非聚集索引是不同的对象,必须分别进行压缩。
Mike Fal 2015年

我表现不好。您的答案正好是我要解决的问题–可以压缩聚簇索引(无论它是在建立索引),也可以压缩堆(如果没有聚簇索引),不能同时压缩两者。而且非聚集索引也可以单独压缩。
Ross Presser 2015年

确实,但要清楚一点,您不能在同一表上具有堆和聚簇索引。是一个或另一个。由于SQL Server的行为方式,人们将主键与聚簇索引混淆是很常见的,因此我想确保此答案可以理解区别。
Mike Fal 2015年
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.