如果我在表的聚集索引上设置压缩(页或行),这与在表上设置压缩相同吗?
SQL Server提供了两个选项,这表明它们是不同的,但我的印象是聚集索引和表本质上是相同的,我关于聚集索引工作方式的心智模型告诉我,压缩聚集索引也必须压缩表。
发布于 2013-09-12 18:01:35
如果我在表的聚集索引上设置压缩(页或行),这与在表上设置压缩相同吗?
是。
来自MSDN:
使用“重新生成和语法”重新生成整个表,包括分区表中的所有分区。如果表具有聚集索引,则重构选项将重新生成聚集索引。
Server提供了两种操作的选项,这表明它们是不同的
这两种语法都存在的原因是因为表不一定有聚集索引。换句话说,ALTER INDEX ALL ON ... REBUILD不影响堆(尽管它会触及所有非集群),所以另一条路由就是为了达到这个目的。
另外,虽然文档没有明确地这样说,但是ALTER TABLE ... REBUILD语法并没有启用/禁用对表上所有非聚集索引的压缩。它只影响堆或聚集索引。
最后,如果您正在通过SSMS测试这一点,请注意,当禁用压缩时,要注意可能会有错误 --用脚本编写出来,这样您就可以了解到底发生了什么。
发布于 2013-09-12 16:47: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;Server还提供了几种使列惟一的不同方法:
CREATE TABLE dbo.foo1(bar INT UNIQUE);...or...
CREATE TABLE dbo.foo2(bar INT, CONSTRAINT x2 UNIQUE(bar));...or...
CREATE TABLE dbo.foo3(bar INT);
ALTER TABLE dbo.foo3 ADD CONSTRAINT x3 UNIQUE(bar);...or...
CREATE TABLE dbo.foo4(bar INT);
CREATE UNIQUE INDEX x4 ON dbo.foo4(bar);这些都将以相同的底层实现(具有不同的名称)结束。
仅仅因为有不同的工作方式,并不意味着你就不会继续呆在办公室。:-)
https://dba.stackexchange.com/questions/49757
复制相似问题