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
答案 0 :(得分:2)
'DISTINCT'是罪魁祸首。一旦有多个索引,sys.partitions中也有多个条目。但是明显隐藏了其他条目。
这里我有一个名为Album的表,有2个索引,我用
压缩ALTER TABLE Album REBUILD WITH (DATA_COMPRESSION = PAGE);
运行此语句后,非聚集索引保持未压缩状态并一直显示在列表中。
编辑: 事实证明,当您只想了解表级压缩时,只需过滤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)