聚集索引压缩与表压缩 - 它们是一回事吗?

pau*_*ulH 8 sql-server sql-server-2008-r2 compression

如果我在表的聚集索引上设置压缩(页或行),这与在表上设置压缩相同吗?

SQL Server 为两者提供了选项,这表明它们是不同的,但我的印象是聚簇索引和表本质上是同一件事,我对聚簇索引如何工作的心理模型告诉我压缩聚簇索引还必须压缩表。

Jon*_*gel 11

如果我在表的聚集索引上设置压缩(页或行),这与在表上设置压缩相同吗?

是的。

MSDN

使用 REBUILD WITH 语法重建整个表,包括分区表中的所有分区。如果表有聚集索引,REBUILD 选项会重建聚集索引。


SQL Server 提供了执行这两种操作的选项,这表明它们是不同的

两种语法都存在的原因是因为表不一定聚集索引。换句话说,ALTER INDEX ALL ON ... REBUILD不影响堆(尽管它会触及所有非集群),因此另一条路线用于该目的。

此外,虽然文件没有明确这么说,在ALTER TABLE ... REBUILD语法没有启用/全部禁用压缩非聚集的表索引。它只影响堆或聚集索引。

最后,如果您通过 SSMS 对此进行测试,请注意在禁用压缩时您可能会收到错误- 编写脚本以便您可以看到实际发生的情况。


Aar*_*and 5

聚集索引就是表。因此,将其设置为相同的。您可以通过比较此处的两种情况来验证这一点:

SELECT OBJECT_NAME(p.object_id),*
 FROM sys.partitions AS p
 INNER Join sys.indexes AS i 
 ON p.object_id = i.object_id 
 AND p.index_id = i.index_id
 WHERE p.data_compression > 0;
Run Code Online (Sandbox Code Playgroud)

SQL Server 还提供了几种不同的方法来使列唯一:

CREATE TABLE dbo.foo1(bar INT UNIQUE);
Run Code Online (Sandbox Code Playgroud)

...或者...

CREATE TABLE dbo.foo2(bar INT, CONSTRAINT x2 UNIQUE(bar));
Run Code Online (Sandbox Code Playgroud)

...或者...

CREATE TABLE dbo.foo3(bar INT);
ALTER TABLE dbo.foo3 ADD CONSTRAINT x3 UNIQUE(bar);
Run Code Online (Sandbox Code Playgroud)

...或者...

CREATE TABLE dbo.foo4(bar INT);
CREATE UNIQUE INDEX x4 ON dbo.foo4(bar);
Run Code Online (Sandbox Code Playgroud)

这些最终都会得到相同的底层实现(具有不同的名称)。

仅仅因为有不同的上班方式并不意味着您仍然不会在办公室。:-)