精确空间占用,并按总预留空间从大到小排序:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
» 本文链接地址:https://blog.mydns.vip/4962.html
豫章小站













最新评论