SQL Server:求数据库各表对象级页与行压缩检测脚本
检测SQL Server各数据库表的行/页压缩情况脚本
ms_foreachdb 属于未公开的系统存储过程,对带特殊字符(比如空格、连字符)的数据库支持差,遍历逻辑也存在局限性,这是它失效的常见原因。下面是更可靠的替代方案:
遍历所有用户数据库的通用脚本
该脚本自动排除系统数据库,查询每个用户库中所有用户表的压缩配置:
DECLARE @SQL NVARCHAR(MAX) = N''; SELECT @SQL += N' USE [' + name + N']; SELECT DB_NAME() AS database_name, SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name, p.data_compression_desc AS compression_type, p.data_compression AS compression_code FROM sys.tables t JOIN sys.partitions p ON t.object_id = p.object_id WHERE p.index_id IN (0, 1) -- 仅取堆表或聚集索引的分区(代表表本身的压缩配置) AND t.is_ms_shipped = 0; -- 排除系统表 ' FROM sys.databases WHERE database_id > 4 -- 排除master、model、msdb、tempdb AND state_desc = N'ONLINE'; -- 仅查询在线数据库 EXEC sp_executesql @SQL;
单个数据库的检测脚本
若只需检查特定数据库,替换 <YourDatabaseName> 后执行:
USE [<YourDatabaseName>]; SELECT SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name, p.data_compression_desc AS compression_type, p.data_compression AS compression_code FROM sys.tables t JOIN sys.partitions p ON t.object_id = p.object_id WHERE p.index_id IN (0, 1) AND t.is_ms_shipped = 0;
字段说明
compression_type:直接显示压缩类型,取值为NONE(无压缩)、ROW(行压缩)、PAGE(页压缩)compression_code:数值编码,0=无压缩,1=行压缩,2=页压缩
注意事项
- 执行脚本需要具备VIEW DEFINITION权限,或者对目标数据库有SELECT权限
- 如果表存在多个分区,脚本会返回每个分区的压缩配置(若分区压缩配置不同)
内容的提问来源于stack exchange,提问作者Pavan
相关产品推荐
相关产品推荐

