精确空间占用,并按总预留空间从大到小排序:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
-- unallocated space 如果占用,使用下面命令 收缩数据库文件(谨慎操作,建议先备份) USE 数据库名; GO DBCC SHRINKDATABASE (richmat6565, 10); -- 预留10%的可用空间 GO
— 查看数据文件内部使用情况
DBCC SHOWFILESTATS;
GO
~~~~~~~~~~~~~~~~~~~~~~~~
找出空间被谁占用了
如果想精确知道 被哪些表和索引占用,执行以下查询:
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







