查看数据库表的可释放空间大小,查询语句如下:

SELECT  top 20  db_name() as DbName,

t.NAME AS TableName,

s.Name AS SchemaName,

p.rows AS RowCounts,

SUM(a.total_pages) * 8 AS TotalSpaceKB,

-- CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS 总共占用空间MB,

CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00/1024.00), 2) AS NUMERIC(36, 2)) AS 总共占用空间GB,

-- SUM(a.used_pages) * 8 AS UsedSpaceKB,

CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00 / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceGB,

-- (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,

CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceGB

FROM

sys.tables t

INNER JOIN

sys.indexes i ON t.OBJECT_ID = i.object_id

INNER JOIN

sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id

INNER JOIN

sys.allocation_units a ON p.partition_id = a.container_id

LEFT OUTER JOIN

sys.schemas s ON t.schema_id = s.schema_id

WHERE

t.NAME NOT LIKE 'dt%'

AND t.is_ms_shipped = 0

AND i.OBJECT_ID > 0

GROUP BY

t.Name, s.Name, p.Rows

ORDER BY

UnusedSpaceGB desc

对未使用空间较大的表进行重建索引,语句如下:

alter table dbo.表名 rebuild;(不建议大规模使用,影响业务)

--找到要重建的索引的表

SELECT top 20

t.NAME AS TableName,

CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceGB

--临时表

into #table1

FROM

sys.tables t

INNER JOIN

sys.indexes i ON t.OBJECT_ID = i.object_id

INNER JOIN

sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id

INNER JOIN

sys.allocation_units a ON p.partition_id = a.container_id

LEFT OUTER JOIN

sys.schemas s ON t.schema_id = s.schema_id

WHERE

t.NAME NOT LIKE 'dt%'

AND t.is_ms_shipped = 0

AND i.OBJECT_ID > 0

GROUP BY

t.Name, s.Name, p.Rows

ORDER BY

UnusedSpaceGB desc

--把选出的表写进变量里

DECLARE @ColumnData NVARCHAR(MAX);

SELECT @ColumnData = STRING_AGG(CAST(TableName AS NVARCHAR(MAX)), ''',''')

FROM #table1;

set @ColumnData=''''+ @ColumnData + ''''

SELECT @ColumnData

--找到索引

SELECT

TableName = t.name,

IndexName = ind.name,

ind.type_desc,

ind.is_unique,

ind.is_primary_key

into #table

FROM

sys.indexes ind

INNER JOIN sys.tables t ON ind.object_id = t.object_id

INNER JOIN sys.schemas s ON t.schema_id = s.schema_id

WHERE

t.name IN ('','')

--t.name IN (SELECT value FROM STRING_SPLIT(@ColumnData, ','))

--in 实际查询的是整个整体。

and ind.name is not null

ORDER BY

ind.is_primary_key DESC

--打印出sql语句

DECLARE @TableName NVARCHAR(MAX);

DECLARE @IndexName NVARCHAR(MAX);

DECLARE @sql NVARCHAR(MAX);

DECLARE tableCursor1 CURSOR FOR

SELECT TableName, IndexName FROM #table;

-- 创建临时表来存储@sql语句

CREATE TABLE #TempSQL (

SQLStatement NVARCHAR(MAX)

);

OPEN tableCursor1;

FETCH NEXT FROM tableCursor1 INTO @TableName, @IndexName;

WHILE @@FETCH_STATUS = 0

BEGIN

SET @sql = 'ALTER INDEX ' + @IndexName + ' ON ' + @TableName + ' REBUILD with (online=on)';

-- 插入@sql语句到临时表中

INSERT INTO #TempSQL (SQLStatement) VALUES (@sql);

--EXEC sp_executesql @sql;

FETCH NEXT FROM tableCursor1 INTO @TableName, @IndexName;

END

CLOSE tableCursor1;

DEALLOCATE tableCursor1;

-- 查询临时表中的内容

SELECT * FROM #TempSQL;

drop table #table1

drop table #table

drop table #TempSQL

---根据索引碎片率查询

SELECT

OBJECT_NAME(ips.object_id) AS TableName,

i.name AS IndexName,

ips.avg_fragmentation_in_percent AS FragmentationRate,

ips.index_type_desc as IndexType,

ips.page_count AS PageCount,

CONCAT('ALTER INDEX ', i.name,' ON ',OBJECT_NAME(ips.object_id), ' REBUILD with (online=on);') as 索引执行语句

FROM

sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, null) ips

JOIN

sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id

WHERE

ips.avg_fragmentation_in_percent > 30and i.name is not null -- 只查询有碎片化的索引

ORDER BY

ips.avg_fragmentation_in_percent DESC;

---查找大表

SELECT

TableName = obj.name,

TotalRows = prt.rows,

[SpaceUsedcGB] = SUM(alloc.used_pages)*8/1024/1024

FROM sys.objects obj

JOIN sys.indexes idx on obj.object_id = idx.object_id

JOIN sys.partitions prt on obj.object_id = prt.object_id

JOIN sys.allocation_units alloc on alloc.container_id = prt.partition_id

WHERE

obj.type = 'U' AND idx.index_id IN (0, 1)

GROUP BY obj.name, prt.rows

ORDER BY SpaceUsedcGB DESC

-- 使用DBCC SHOWCONTIG查看碎片

DBCC SHOWCONTIG('YourDatabaseName.YourTableName');)

##查找索引,先弄聚合索引

exec sp_helpindex 表名

ALTER INDEX @IndexName ON @TableName REBUILD with (online=on);

ALTER INDEX @IndexName ON @TableName REORGANIZE WITH ( LOB_COMPACTION = ON )

-- 重建表上的所有索引

ALTER TABLE table_name REBUILD ALL INDEXES;

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐