西数超哥博客
运维经验教程分享

mssql数据库磁盘空间占用分析及压缩

精确空间占用,并按总预留空间从大到小排序:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SELECT
t.object_id,
OBJECT_NAME(t.object_id) ObjectName,
sum(u.used_pages) * 8 Used_Space_kb,
u.type_desc,
max(p.rows) RowsCount
FROM
sys.allocation_units u
JOIN sys.partitions p on u.container_id = p.hobt_id
JOIN sys.tables t on p.object_id = t.object_id
GROUP BY
t.object_id,
OBJECT_NAME(t.object_id),
u.type_desc
ORDER BY
Used_Space_kb desc;

立即执行这个诊断查询.查询详细占用
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

USE 数据库名;;
GO

— 查看当前数据库空间详情
EXEC sp_spaceused;
GO

— 查看数据文件内部使用情况
DBCC SHOWFILESTATS;
GO

~~~~~~~~~~~~~~~~~~~~~~~~

找出空间被谁占用了

如果想精确知道 97.75MB 被哪些表和索引占用,执行以下查询:

USE [数据库名];
GO

— 按表和索引统计实际占用空间
SELECT
OBJECT_NAME(s.object_id) AS TableName,
i.name AS IndexName,
i.type_desc AS IndexType,
SUM(s.used_page_count) * 8 / 1024.0 AS UsedSpaceMB,
SUM(s.reserved_page_count) * 8 / 1024.0 AS ReservedSpaceMB
FROM sys.dm_db_partition_stats s
JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id
WHERE s.object_id > 100 — 排除系统表
GROUP BY s.object_id, i.name, i.type_desc
ORDER BY SUM(s.used_page_count) DESC;
GO

~~~~~~~~~~~

重建索引并收缩
~~~~~~~~~~~~~~~~~~~~~~~~~~

— ===== 一键清理方案 =====
USE [数据库名];
GO

— 第1步:查看清理前的空间
EXEC sp_spaceused;
DBCC SHOWFILESTATS;
GO

— 第2步:清理 Query Store 数据
ALTER DATABASE [数据库名] SET QUERY_STORE CLEAR;
GO

— 第3步:收缩数据文件(回收未使用空间)
DBCC SHRINKFILE (N’数据库名_Data’, 40); — 目标40MB
GO

— 第4步:重建索引(消除碎片)
EXEC sp_msforeachtable ‘ALTER INDEX ALL ON ? REBUILD’;
GO

— 第5步:查看清理后的空间
EXEC sp_spaceused;
DBCC SHOWFILESTATS;
GO

— 第6步:重新配置 Query Store(防止再次膨胀)
ALTER DATABASE [数据库名]
SET QUERY_STORE (MAX_STORAGE_SIZE_MB = 50);
GO

赞(0)
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除。本站原创内容未经允许不得转载:西数超哥博客 » mssql数据库磁盘空间占用分析及压缩

登录

找回密码

注册