paulH Asked: 2013-09-13 08:00:20 +0800 CST2013-09-13 08:00:20 +0800 CST 2013-09-13 08:00:20 +0800 CST 聚集索引压缩与表压缩——它们是一回事吗? 772 如果我在表的聚集索引上设置压缩(页或行),这与在表上设置压缩相同吗? SQL Server 提供了两者的选项,这表明它们是不同的,但我的印象是聚集索引和表本质上是相同的,我对聚集索引如何工作的心理模型告诉我压缩聚集索引还必须压缩表。 sql-server sql-server-2008-r2 2 个回答 Voted Best Answer Jon Seigel 2013-09-13T10:01:35+08:002013-09-13T10:01:35+08:00 如果我在表的聚集索引上设置压缩(页或行),这与在表上设置压缩相同吗? 是的。 来自MSDN: 使用 REBUILD WITH 语法重建整个表,包括分区表中的所有分区。如果表有聚集索引,REBUILD 选项会重建聚集索引。 SQL Server 提供了两者的选项,这表明它们是不同的 两种语法都存在的原因是表不一定有聚集索引。换句话说,ALTER INDEX ALL ON ... REBUILD不会影响堆(尽管它会触及所有非集群),因此另一条路由服务于该目的。 此外,虽然文档没有明确说明,但该ALTER TABLE ... REBUILD语法并未启用/禁用表上所有非聚集索引的压缩。它只影响堆或聚集索引。 最后,如果您通过 SSMS 进行测试,请注意在禁用压缩时您可能会遇到错误- 编写脚本以便查看实际情况。 Aaron Bertrand 2013-09-13T08:47:00+08:002013-09-13T08:47:00+08:00 聚集索引就是表。因此,将其设置在任何一个上都是相同的。您可以通过在此处比较两种情况来验证这一点: 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); 这些最终都将具有相同的底层实现(具有不同的名称)。 仅仅因为有不同的上班方式并不意味着你最终不会在办公室。:-)
是的。
来自MSDN:
两种语法都存在的原因是表不一定有聚集索引。换句话说,
ALTER INDEX ALL ON ... REBUILD
不会影响堆(尽管它会触及所有非集群),因此另一条路由服务于该目的。此外,虽然文档没有明确说明,但该
ALTER TABLE ... REBUILD
语法并未启用/禁用表上所有非聚集索引的压缩。它只影响堆或聚集索引。最后,如果您通过 SSMS 进行测试,请注意在禁用压缩时您可能会遇到错误- 编写脚本以便查看实际情况。
聚集索引就是表。因此,将其设置在任何一个上都是相同的。您可以通过在此处比较两种情况来验证这一点:
SQL Server 还提供了几种不同的方法来使列唯一:
...或者...
...或者...
...或者...
这些最终都将具有相同的底层实现(具有不同的名称)。
仅仅因为有不同的上班方式并不意味着你最终不会在办公室。:-)