首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚集索引压缩与表压缩--它们是相同的吗?

聚集索引压缩与表压缩--它们是相同的吗?
EN

Database Administration用户
提问于 2013-09-12 16:00:20
回答 2查看 6.7K关注 0票数 8

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

SQL Server提供了两个选项,这表明它们是不同的,但我的印象是聚集索引和表本质上是相同的,我关于聚集索引工作方式的心智模型告诉我,压缩聚集索引也必须压缩表。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2013-09-12 18:01:35

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

是。

来自MSDN

使用“重新生成和语法”重新生成整个表,包括分区表中的所有分区。如果表具有聚集索引,则重构选项将重新生成聚集索引。

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

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

另外,虽然文档没有明确地这样说,但是ALTER TABLE ... REBUILD语法并没有启用/禁用对表上所有非聚集索引的压缩。它只影响堆或聚集索引。

最后,如果您正在通过SSMS测试这一点,请注意,当禁用压缩时,要注意可能会有错误 --用脚本编写出来,这样您就可以了解到底发生了什么。

票数 11
EN

Database Administration用户

发布于 2013-09-12 16:47:00

聚集索引是表。所以,把它设置在任何一个都是一样的。您可以通过在这里比较这两种情况来验证这一点:

代码语言:javascript
复制
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还提供了几种使列惟一的不同方法:

代码语言:javascript
复制
CREATE TABLE dbo.foo1(bar INT UNIQUE);

...or...

代码语言:javascript
复制
CREATE TABLE dbo.foo2(bar INT, CONSTRAINT x2 UNIQUE(bar));

...or...

代码语言:javascript
复制
CREATE TABLE dbo.foo3(bar INT);
ALTER TABLE dbo.foo3 ADD CONSTRAINT x3 UNIQUE(bar);

...or...

代码语言:javascript
复制
CREATE TABLE dbo.foo4(bar INT);
CREATE UNIQUE INDEX x4 ON dbo.foo4(bar);

这些都将以相同的底层实现(具有不同的名称)结束。

仅仅因为有不同的工作方式,并不意味着你就不会继续呆在办公室。:-)

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/49757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档