压缩表后为什么不更新系统表

时间:2015-04-01 21:39:43

标签: sql-server

SQL Server 2012

我想压缩表和索引。我做了一个搜索,找到未压缩的表,并通过在压缩之前查看表属性/存储来手动检查脚本的准确性。我按如下方式为表生成了脚本:

ALTER TABLE [R_CompPen].[CP2507BodySystem] 
   REBUILD WITH (DATA_COMPRESSION=PAGE);

脚本运行后我通过SMS验证了压缩,但我运行的脚本找到未压缩的表并生成脚本仍显示为未压缩。

所以问题是为什么Alter Table脚本没有更新系统表,如果它实际上只是显示索引,那么如何编写脚本只显示表,而相反的是另一个脚本只显示索引?

SELECT distinct 'ALTER TABLE [' 
   + sc.[name] + '].[' + st.[name] 
   + '] REBUILD WITH (DATA_COMPRESSION=PAGE);'
FROM sys.partitions SP
INNER JOIN sys.tables ST ON st.object_id = sp.object_id
INNER JOIN sys.Schemas SC on sc.schema_ID = st.schema_ID
WHERE sp.data_compression = 0

1 个答案:

答案 0 :(得分:2)

'DISTINCT'是罪魁祸首。一旦有多个索引,sys.partitions中也有多个条目。但是明显隐藏了其他条目。

这里我有一个名为Album的表,有2个索引,我用

压缩
ALTER TABLE Album REBUILD WITH (DATA_COMPRESSION = PAGE);

运行此语句后,非聚集索引保持未压缩状态并一直显示在列表中。

image of compression state

编辑: 事实证明,当您只想了解表级压缩时,只需过滤index_id 0或1.更高的数字指的是非聚簇索引。来自Barguast解决方案的无耻副本own question

SELECT [t].[name] AS [Table], [p].[partition_number] AS [Partition],
    [p].[data_compression_desc] AS [Compression]
FROM [sys].[partitions] AS [p]
INNER JOIN sys.tables AS [t] ON [t].[object_id] = [p].[object_id]
WHERE [p].[index_id] in (0,1)