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


8

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

SQL Server提供了两种选择,这表明它们是不同的,但是我给人的印象是聚簇索引和表本质上是同一件事,而我关于聚簇索引如何工作的思维模型告诉我压缩聚簇索引还必须压缩表。

Answers:


11

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

是。

MSDN

使用REBUILD WITH语法可以重建整个表,包括分区表中的所有分区。如果表具有聚簇索引,则REBUILD选项将重建聚簇索引。


SQL Server提供了两种选择,这表明它们是不同的

两种语法都存在的原因是,表不一定具有聚簇索引。换句话说,ALTER INDEX ALL ON ... REBUILD它不会影响堆(尽管它将接触所有非集群的堆),因此另一条路由可以达到这一目的。

此外,尽管文档中没有明确说明,但ALTER TABLE ... REBUILD语法并未启用/禁用表上所有非聚集索引的压缩。它仅影响堆或聚集索引。

最后,如果您正在通过SSMS进行测试,请注意禁用压缩时可能会出现错误 -编写脚本脚本,以便您了解实际情况。


谢谢乔恩,很好的解释!很高兴听到事情会按我预期的那样进行(这肯定不是总是如此!)
paul H

4

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

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;

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

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...要么...

CREATE TABLE dbo.foo2(bar INT, CONSTRAINT x2 UNIQUE(bar));

...要么...

CREATE TABLE dbo.foo3(bar INT);
ALTER TABLE dbo.foo3 ADD CONSTRAINT x3 UNIQUE(bar);

...要么...

CREATE TABLE dbo.foo4(bar INT);
CREATE UNIQUE INDEX x4 ON dbo.foo4(bar);

这些最终都将具有相同的基础实现(具有不同的名称)。

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

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.