Sql server 如何判断SQL Server 2005数据库中哪些表占用的空间最大?
如何判断SQL Server 2005数据库中哪些表占用的空间最大 我确信有一些系统存储过程显示了这些信息 我有一个从1tb增长到23tb的测试数据库。我们目前正在数据库中进行大量客户机转换测试,这需要多次运行相同的转换存储过程。它确实会删除,我确信这会增加事务日志。但这让我想问这个问题 信息Sql server 如何判断SQL Server 2005数据库中哪些表占用的空间最大?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,如何判断SQL Server 2005数据库中哪些表占用的空间最大 我确信有一些系统存储过程显示了这些信息 我有一个从1tb增长到23tb的测试数据库。我们目前正在数据库中进行大量客户机转换测试,这需要多次运行相同的转换存储过程。它确实会删除,我确信这会增加事务日志。但这让我想问这个问题 信息 最大的问题是dbo.Download表,它创建了实际上不需要的海量存储,在截断它之前我有3GB,然后是52MB;) 尝试此脚本-它将列出数据库中所有表的行数和数据行使用的空间(以及使用的总空间): SEL
最大的问题是dbo.Download表,它创建了实际上不需要的海量存储,在截断它之前我有3GB,然后是52MB;) 尝试此脚本-它将列出数据库中所有表的行数和数据行使用的空间(以及使用的总空间):
SELECT
t.NAME AS TableName,
i.name AS indexName,
SUM(p.rows) AS RowCounts,
SUM(a.total_pages) AS TotalPages,
SUM(a.used_pages) AS UsedPages,
SUM(a.data_pages) AS DataPages,
(SUM(a.total_pages) * 8) / 1024 AS TotalSpaceMB,
(SUM(a.used_pages) * 8) / 1024 AS UsedSpaceMB,
(SUM(a.data_pages) * 8) / 1024 AS DataSpaceMB
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
WHERE
t.NAME NOT LIKE 'dt%' AND
i.OBJECT_ID > 255 AND
i.index_id <= 1
GROUP BY
t.NAME, i.object_id, i.index_id, i.name
ORDER BY
OBJECT_NAME(i.object_id)
选择
t、 名称为TableName,
i、 名称为indexName,
总和(p.行)作为行计数,
合计(总页数)为总页数,
作为已用页面的总和(a.已用页面),
作为数据页的总和(a.数据页),
(总页数)*8)/1024总计为MB,
(总计(使用的页数)*8)/1024作为使用的空间MB,
(总计(a.数据页)*8)/1024作为数据空间MB
从…起
系统表t
内连接
t.OBJECT\u ID=i.OBJECT\u ID上的sys.index i
内连接
i.object\u id=p.object\u id和i.index\u id=p.index\u id上的sys.p分区
内连接
p.partition\u id=a.container\u id上的sys.allocation\u units a
哪里
t、 名称不象“dt%”和
i、 对象ID>255和
i、 索引idUse
Exec sp\u spaceused N'YourTableName'
或者,如果要对数据库中的每个表执行sp_spaceused
,则可以使用以下SQL:
set nocount on
create table #spaceused (
name nvarchar(120),
rows char(11),
reserved varchar(18),
data varchar(18),
index_size varchar(18),
unused varchar(18)
)
declare Tables cursor for
select name
from sysobjects where type='U'
order by name asc
OPEN Tables
DECLARE @table varchar(128)
FETCH NEXT FROM Tables INTO @table
WHILE @@FETCH_STATUS = 0
BEGIN
insert into #spaceused exec sp_spaceused @table
FETCH NEXT FROM Tables INTO @table
END
CLOSE Tables
DEALLOCATE Tables
select * from #spaceused
drop table #spaceused
exec sp_spaceused
上面的SQL来自Rossisdead的评论对我回答了这个问题,我希望它不是隐藏在评论中。这对于像我这样不想编写解决方案脚本的人来说是很有用的(OP没有询问代码片段)
如果您使用的是ManagementStudio,也可以右键单击
数据库,然后转到“报告->磁盘使用情况(按表)”,以获取相同的数据
结果
谢谢@marc_的回答。我需要知道数据与索引空间的关系,所以我继续并扩展了查询,以包括这一点
SELECT TableName
, SUM(DataRowCounts) AS DataRowCounts
, SUM(DataTotalSpaceGB) AS DataTotalSpaceGB
, SUM(DataSpaceUsedGB) AS DataSpaceUsedGB
, SUM(DataUnusedSpaceGB) AS DataUnusedSpaceGB
, SUM(IndexRowCounts) AS IndexRowCounts
, SUM(IndexTotalSpaceGB) AS IndexTotalSpaceGB
, SUM(IndexSpaceUsedGB) AS IndexSpaceUsedGB
, SUM(IndexUnusedSpaceGB) AS IndexUnusedSpaceGB
, SUM(DataTotalSpaceGB) + SUM(IndexTotalSpaceGB) AS TotalSpaceGB
FROM
(
SELECT t.NAME AS TableName
, i.type_desc AS IndexType
, CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataTotalSpaceGB
, CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataSpaceUsedGB
, CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataUnusedSpaceGB
, CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN SUM(p.Rows) ELSE 0 END AS DataRowCounts
, CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexTotalSpaceGB
, CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexSpaceUsedGB
, CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexUnusedSpaceGB
, CASE WHEN i.type_desc = 'NONCLUSTERED' THEN SUM(p.Rows) ELSE 0 END AS IndexRowCounts
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 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 > 255
AND s.Name = 'dbo' --update this filter
AND t.Name = 'MyTable'
GROUP BY t.Name
, i.type_desc
) x
GROUP BY TableName
ORDER BY TotalSpaceGB DESC
对于较新版本的SQL Server,您还可以使用exec sp_msforeachtable“exec sp_spaceused N”?“”“
@JNKsp_msforeachtable
,因为至少存在SQL Server2000@SQLMenace-谢谢你的信息。在发布之前,我没有研究它有多老,但因为它没有文档记录,所以我不确定我能找到它。一个稍微简单的例子:如果你愿意,你可以跳过执行官和花哨的引用,只做sp_msforeachtable'sp_spaceused[?]”
。回到SQL2000进行验证。这种方法的主要问题是,它不会作为单一结果返回,因为Marc_S和Barry的答案非常突出,所以我对这两个答案都进行了投票,并等待看哪一个获得了最多的投票,这样我就可以用“接受的答案”来奖励那一个。但他们在5点打成平局,所以我只选了一个,但我两个都用了。非常感谢Marc_和Barry+1.太棒了。请注意,这不包括数据索引的大小。但对我来说,它完成了任务。我不知道这一点,但如果您使用的是Management Studio,您也可以右键单击数据库并转到“报告”->“磁盘使用情况表”,以获得相同的结果。@RossiDead,这是一条非常有趣的信息。谢谢我得到'Table'sys.tables'不存在'@Seano:您使用的是什么SQL Server版本?(运行SELECT@@VERSION
以了解)您的数据库具有什么数据库兼容性级别??重点是:右键单击数据库,而不是服务器实例