精确空间占用,并按总预留空间从大到小排序:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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







