获取数据库中所有表的大小

Eri*_*ric 1180 t-sql sql-server

我继承了一个相当大的SQL Server数据库.考虑到它包含的数据,它似乎占用了比我预期更多的空间.

有没有一种简单的方法可以确定每个表占用的磁盘空间大小?

mar*_*c_s 2418

SELECT 
    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 TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
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 > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name
Run Code Online (Sandbox Code Playgroud)

  • @Todd:有些人希望它以这种方式订购 - 其他人想要按表名称 - 按照您的选择,根据需要调整代码.... (33认同)
  • 如果您的表被分区,它们会多次显示,而不会显示正在发生的事情.您可以将p.partition_number添加到选择列表中,也可以SUM(p.Rows)并将其从组中删除. (11认同)
  • 愚蠢的问题,但这个查询是否可能导致行锁定? (6认同)
  • 索引也使用空间,索引使用的空间量可以通过下面的[查询](http://stackoverflow.com/questions/7892334/#17600911)找到. (6认同)
  • 您的脚本存在筛选索引的问题:对于给定表的每个筛选索引,我在结果中看到一个额外的行,其中包含该表的名称.每个额外行的"RowCounts"对应于其中一个过滤索引所覆盖的行数.(在Sql2012上) (6认同)
  • 对于因过滤索引(需要表的实际行)而面临重复行的任何人,只需在“AND i.filter_definition IS NULL”的条件下再添加一个。 (5认同)
  • 非常有用,谢谢.我一直在使用`sys.dm_db_partition_stats`,它运行得很好,但是在拥有数千个表的数据库上运行速度要快得多. (3认同)
  • 如果您使用分区,请尝试使用@xav提供的下面的sql脚本.这很好地汇总了表格并且具有行计数的准确值.简单地对p.rows进行求和并不会产生准确的结果. (3认同)
  • @GEMI:任何SELECT通常在行上都有*共享(读)锁* - 是的. (2认同)
  • 输出有重复 (2认同)
  • *输出有重复*。我也看到了这个。`sys.partitions.rows` 被记录为大概的行数。我有一个表,其中估计的行因索引而异。如果您想缓解此问题,请使用 `rows` 的 `MIN`、`MAX` 或 `AVG`。 (2认同)
  • 有人可以解释行t.NAME NOT LIKE'dt%'的目的 (2认同)
  • @Perposterer:排除 SSMS 图表支持包含在您的数据库中的 `dtproperties` 表。它不是你的一张桌子——所以你通常不需要知道/不在乎它有多大...... (2认同)
  • 要修复由于筛选索引导致的重复行,您可以删除 p.Rows 上的分组依据,并将“p.rows”的选择更改为“max(p.rows) as rows”(因为筛选索引具有较小的行)计数,但堆或聚集索引将具有正确的计数并将由最大值返回)。在多个企业数据库上进行了测试,其中包括一个拥有超过 12.5k 个表的数据库。@marc_s 这是一个很好的答案,谢谢!多年来我已经使用过它很多次,最近刚刚遇到了过滤索引问题。 (2认同)

Kev*_*don 534

如果您使用的是SQL Server Management Studio(SSMS),则可以运行标准报告,而不是运行查询(在我的情况下返回重复的行). 

  1. 右键单击数据库
  2. 导航到报告>标准报告>按表格的磁盘使用情况

注意:必须将数据库兼容级别设置为90或更高才能使其正常工作.请参阅http://msdn.microsoft.com/en-gb/library/bb510680.aspx

  • 在Management Studio 2012中,您可以执行以下操作:查看对象资源管理器详细信息(F7)并导航到对象资源管理器中的"表".在"详细信息"中,右键单击标题并选择"大小"列. (52认同)
  • 似乎不存在于Azure SQL中:-( (6认同)
  • 为 SSMS 2012 的新功能提供建议。对于我们这些老手来说,我们从来没有这个功能。所以我们只是用旧的 TSQL 方式做的 :) (4认同)
  • 信不信由你,有时凡人(开发人员)希望看到这些信息,我们没有权限使用内置报告,但我们可以在接受的答案中运行TSQL.:)仅供参考(顺便说一下,我仍然赞成你的回答) (3认同)
  • 我知道这并不严重,但是,请您将边缘化群体从工程和技术中推开,到处都在重复这种推理。您应该同时学习两者,但也不应该因为人们使用节省时间的实用程序来更智能、更快速地工作而责备他们。(虽然 SSMS 有时似乎是一个“减慢实用程序”...... :X)就个人而言,表格数据的读数通常在 GUI 中更清晰,尽管 Microsoft 构建的工具往往是与 UI 相关的所有内容的例外。 (3认同)

Axl*_*xle 97

sp_spaceused可以获取有关表,索引视图或整个数据库使用的磁盘空间的信息.

例如:

USE MyDatabase; GO

EXEC sp_spaceused N'User.ContactInfo'; GO
Run Code Online (Sandbox Code Playgroud)

这将报告ContactInfo表的磁盘使用情况信息.

要一次用于所有表:

USE MyDatabase; GO

sp_msforeachtable 'EXEC sp_spaceused [?]' GO
Run Code Online (Sandbox Code Playgroud)

您还可以从右键单击SQL Server的标准报告功能中获取磁盘使用情况.要获取此报告,请从对象资源管理器中的服务器对象导航,向下移动到Databases对象,然后右键单击任何数据库.从出现的菜单中,选择"报告",然后选择"标准报告",然后选择"按分区的磁盘使用情况:[DatabaseName]".

  • 虽然如果你有大量的表,在SSMS中使用`sp_msforeachtable`很容易触发`System.OutOfMemoryException`这很好,所以使用临时表存储结果可能更好. (3认同)
  • 我可以看到 sp_spacedused 的主要问题是它似乎以人类可读的格式返回数据(例如,在我的情况下,在“保留”列中它有“152 KB”)。我认为这将根据需要切换到 MB/GB。这在很多情况下显然很有用,但如果您需要根据大小应用一些逻辑,或者想要比较值或其他任何情况,则不是。我寻找了一种关闭它的方法,但我找不到一个(我使用的是 SQL Server 2005 :() (2认同)

Spa*_*row 50

这是另一种方法:使用SQL Server Management Studio,在对象资源管理器中,转到数据库并选择Tables

在此输入图像描述

然后打开Object Explorer Details(通过按F7或转到View-> Object Explorer Details).在对象资源管理器详细信息页面中,右键单击列标题并启用您希望在页面中看到的列.您也可以按任何列对数据进行排序.

在此输入图像描述

  • 它不适用于Azure SQL表:( (2认同)

Eri*_*ric 39

经过一番搜索,我找不到一种简单的方法来获取所有表格的信息.有一个名为sp_spaceused的便捷存储过程将返回数据库使用的所有空间.如果提供了表名,则返回该表使用的空间.但是,存储过程返回的结果不可排序,因为列是字符值.

以下脚本将生成我正在寻找的信息.

create table #TableSize (
    Name varchar(255),
    [rows] int,
    reserved varchar(255),
    data varchar(255),
    index_size varchar(255),
    unused varchar(255))
create table #ConvertedSizes (
    Name varchar(255),
    [rows] int,
    reservedKb int,
    dataKb int,
    reservedIndexSize int,
    reservedUnused int)

EXEC sp_MSforeachtable @command1="insert into #TableSize
EXEC sp_spaceused '?'"
insert into #ConvertedSizes (Name, [rows], reservedKb, dataKb, reservedIndexSize, reservedUnused)
select name, [rows], 
SUBSTRING(reserved, 0, LEN(reserved)-2), 
SUBSTRING(data, 0, LEN(data)-2), 
SUBSTRING(index_size, 0, LEN(index_size)-2), 
SUBSTRING(unused, 0, LEN(unused)-2)
from #TableSize

select * from #ConvertedSizes
order by reservedKb desc

drop table #TableSize
drop table #ConvertedSizes
Run Code Online (Sandbox Code Playgroud)


Roy*_*mir 36

 exec  sp_spaceused N'dbo.MyTable'
Run Code Online (Sandbox Code Playgroud)

对于所有表格,请使用..(从保罗的评论中添加)

exec sp_MSForEachTable 'exec sp_spaceused [?]'
Run Code Online (Sandbox Code Playgroud)

  • **偷偷摸摸的** - 你从`exec sp_helpdb`改变了****没有**显示任何关于表的内容,更改为`exec sp_spaceused`,但这只是一次只有一个表...它没有给出您可以概览您拥有的表格以及它们拥有的行数以及它们占用的空间. (5认同)
  • exec sp_MSForEachTable'exec sp_spaceused [?]' (4认同)

Jen*_*sen 25

上面的查询很适合查找表使用的空间量(包括索引),但是如果要比较表上索引使用的空间量,请使用以下查询:

SELECT
    OBJECT_NAME(i.OBJECT_ID) AS TableName,
    i.name AS IndexName,
    i.index_id AS IndexID,
    8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM
    sys.indexes AS i JOIN 
    sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id JOIN 
    sys.allocation_units AS a ON a.container_id = p.partition_id
where [i].[is_primary_key] = 0 -- fix for size discrepancy
GROUP BY
    i.OBJECT_ID,
    i.index_id,
    i.name
ORDER BY
    OBJECT_NAME(i.OBJECT_ID),
    i.index_id
Run Code Online (Sandbox Code Playgroud)


小智 14

如果您需要计算SSMS中"表属性 - 存储"页面上完全相同的数字,则需要使用与SSMS中相同的方法对它们进行计数(适用于sql server 2005及更高版本...以及适用于具有LOB字段的表 - 因为只计算"used_pa​​ges"不应该显示准确的索引大小):

;with cte as (
SELECT
t.name as TableName,
SUM (s.used_page_count) as used_pages_count,
SUM (CASE
            WHEN (i.index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
            ELSE lob_used_page_count + row_overflow_used_page_count
        END) as pages
FROM sys.dm_db_partition_stats  AS s 
JOIN sys.tables AS t ON s.object_id = t.object_id
JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
GROUP BY t.name
)
select
    cte.TableName, 
    cast((cte.pages * 8.)/1024 as decimal(10,3)) as TableSizeInMB, 
    cast(((CASE WHEN cte.used_pages_count > cte.pages 
                THEN cte.used_pages_count - cte.pages
                ELSE 0 
          END) * 8./1024) as decimal(10,3)) as IndexSizeInMB
from cte
order by 2 desc
Run Code Online (Sandbox Code Playgroud)


小智 14

当前接受的答案有超过 2600 个赞成票,但在处理多个分区和/或过滤索引时给出了错误的结果。它也不区分数据和索引的大小,这通常是非常相关的。一些建议的修复没有解决核心问题,或者也完全是错误的。

以下查询解决了所有这些问题。

SELECT 
     [object_id]        = t.[object_id]
    ,[schema_name]      = s.[name]
    ,[table_name]       = t.[name]
    ,[index_name]       = CASE WHEN i.[type] in (0,1,5) THEN null    ELSE i.[name] END -- 0=Heap; 1=Clustered; 5=Clustered Columnstore
    ,[object_type]      = CASE WHEN i.[type] in (0,1,5) THEN 'TABLE' ELSE 'INDEX'  END
    ,[index_type]       = i.[type_desc]
    ,[partition_count]  = p.partition_count
    ,[row_count]        = p.[rows]
    ,[data_compression] = CASE WHEN p.data_compression_cnt > 1 THEN 'Mixed'
                               ELSE (  SELECT DISTINCT p.data_compression_desc
                                       FROM sys.partitions p
                                       WHERE i.[object_id] = p.[object_id] AND i.index_id = p.index_id
                                    )
                          END
    ,[total_space_MB]   = cast(round(( au.total_pages                  * (8/1024.00)), 2) AS DECIMAL(36,2))
    ,[used_space_MB]    = cast(round(( au.used_pages                   * (8/1024.00)), 2) AS DECIMAL(36,2))
    ,[unused_space_MB]  = cast(round(((au.total_pages - au.used_pages) * (8/1024.00)), 2) AS DECIMAL(36,2))
FROM sys.schemas s
JOIN sys.tables  t ON s.schema_id = t.schema_id
JOIN sys.indexes i ON t.object_id = i.object_id
JOIN (
    SELECT [object_id], index_id, partition_count=count(*), [rows]=sum([rows]), data_compression_cnt=count(distinct [data_compression])
    FROM sys.partitions
    GROUP BY [object_id], [index_id]
) p ON i.[object_id] = p.[object_id] AND i.[index_id] = p.[index_id]
JOIN (
    SELECT p.[object_id], p.[index_id], total_pages = sum(a.total_pages), used_pages = sum(a.used_pages), data_pages=sum(a.data_pages)
    FROM sys.partitions p
    JOIN sys.allocation_units a ON p.[partition_id] = a.[container_id]
    GROUP BY p.[object_id], p.[index_id]
) au ON i.[object_id] = au.[object_id] AND i.[index_id] = au.[index_id]
WHERE t.is_ms_shipped = 0 -- Not a system table
Run Code Online (Sandbox Code Playgroud)


小智 12

扩展到@xav 应答处理表分区以获得MB和GB的大小.在SQL Server 2008/2012上测试(在一行中注明is_memory_optimized = 1)

SELECT
    a2.name AS TableName,
    a1.rows as [RowCount],
    --(a1.reserved + ISNULL(a4.reserved,0)) * 8 AS ReservedSize_KB,
    --a1.data * 8 AS DataSize_KB,
    --(CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS IndexSize_KB,
    --(CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 AS UnusedSize_KB,
    CAST(ROUND(((a1.reserved + ISNULL(a4.reserved,0)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS ReservedSize_MB,
    CAST(ROUND(a1.data * 8 / 1024.00, 2) AS NUMERIC(36, 2)) AS DataSize_MB,
    CAST(ROUND((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 / 1024.00, 2) AS NUMERIC(36, 2)) AS IndexSize_MB,
    CAST(ROUND((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSize_MB,
    --'| |' Separator_MB_GB,
    CAST(ROUND(((a1.reserved + ISNULL(a4.reserved,0)) * 8) / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS ReservedSize_GB,
    CAST(ROUND(a1.data * 8 / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS DataSize_GB,
    CAST(ROUND((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS IndexSize_GB,
    CAST(ROUND((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSize_GB
FROM
    (SELECT 
        ps.object_id,
        SUM (CASE WHEN (ps.index_id < 2) THEN row_count ELSE 0 END) AS [rows],
        SUM (ps.reserved_page_count) AS reserved,
        SUM (CASE
                WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
                ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
            END
            ) AS data,
        SUM (ps.used_page_count) AS used
    FROM sys.dm_db_partition_stats ps
        --===Remove the following comment for SQL Server 2014+
        --WHERE ps.object_id NOT IN (SELECT object_id FROM sys.tables WHERE is_memory_optimized = 1)
    GROUP BY ps.object_id) AS a1
LEFT OUTER JOIN 
    (SELECT 
        it.parent_id,
        SUM(ps.reserved_page_count) AS reserved,
        SUM(ps.used_page_count) AS used
     FROM sys.dm_db_partition_stats ps
     INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
     WHERE it.internal_type IN (202,204)
     GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)
INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id ) 
INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
WHERE a2.type <> N'S' and a2.type <> N'IT'
--AND a2.name = 'MyTable'       --Filter for specific table
--ORDER BY a3.name, a2.name
ORDER BY ReservedSize_MB DESC
Run Code Online (Sandbox Code Playgroud)


小智 11

我们使用表分区,由于重复记录,上面提供的查询有些问题.

对于那些需要这个的人,在生成"按表使用磁盘使用情况"报告时,您可以在SQL Server 2014运行的查询下面找到.我认为它也适用于以前版本的SQL Server.

它就像一个魅力.

SELECT
    a2.name AS [tablename],
    a1.rows as row_count,
    (a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved, 
    a1.data * 8 AS data,
    (CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS index_size,
    (CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 AS unused
FROM
    (SELECT 
        ps.object_id,
        SUM (
            CASE
                WHEN (ps.index_id < 2) THEN row_count
                ELSE 0
            END
            ) AS [rows],
        SUM (ps.reserved_page_count) AS reserved,
        SUM (
            CASE
                WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
                ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
            END
            ) AS data,
        SUM (ps.used_page_count) AS used
    FROM sys.dm_db_partition_stats ps
        WHERE ps.object_id NOT IN (SELECT object_id FROM sys.tables WHERE is_memory_optimized = 1)
    GROUP BY ps.object_id) AS a1
LEFT OUTER JOIN 
    (SELECT 
        it.parent_id,
        SUM(ps.reserved_page_count) AS reserved,
        SUM(ps.used_page_count) AS used
     FROM sys.dm_db_partition_stats ps
     INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
     WHERE it.internal_type IN (202,204)
     GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)
INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id ) 
INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
WHERE a2.type <> N'S' and a2.type <> N'IT'
ORDER BY a3.name, a2.name
Run Code Online (Sandbox Code Playgroud)


Joe*_*kes 8

Mar_c答案的一个小变化,因为我经常回到这个页面,大多数行首先排序:

SELECT
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB,
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
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 > 255
GROUP BY
    t.Name, s.Name, p.Rows
ORDER BY
    --p.rows DESC --Uncomment to order by amount rows instead of size in KB.
    SUM(a.total_pages) DESC 
Run Code Online (Sandbox Code Playgroud)


小智 7

-- Show the size of all the tables in a database sort by data size descending
SET NOCOUNT ON
DECLARE @TableInfo TABLE (tablename varchar(255), rowcounts int, reserved varchar(255), DATA varchar(255), index_size varchar(255), unused varchar(255))
DECLARE @cmd1 varchar(500)
SET @cmd1 = 'exec sp_spaceused ''?'''

INSERT INTO @TableInfo (tablename,rowcounts,reserved,DATA,index_size,unused)
EXEC sp_msforeachtable @command1=@cmd1

SELECT * FROM @TableInfo ORDER BY Convert(int,Replace(DATA,' KB','')) DESC
Run Code Online (Sandbox Code Playgroud)


Irf*_*Irf 7

对于Azure,我使用了以下方法:

您应该拥有SSMS v17.x

我用了;

在此处输入图片说明

就像用户 Sparrow所说的

打开Databases>并选择Tables
然后按F7键, 您应该看到row count
在此处输入图片说明

这里的 SSMS 已连接到Azure数据库

  • 右键单击列可显示其他属性,例如索引空间或使用的数据空间。 (3认同)
  • F7未被充分利用。 (2认同)

Pal*_*ine 7

SELECT o.name AS ObjectName, 
       SUM(reserved_page_count) * 8.0 / 1024 AS SizeinMB
FROM sys.dm_db_partition_stats AS ps
INNER JOIN sys.sysobjects AS o
ON ps.object_id = o.id
GROUP BY o.name
ORDER BY SizeinMB DESC;
Run Code Online (Sandbox Code Playgroud)


Wil*_*eth 5

这将为您提供大小,并记录每个表的计数。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- Get a list of tables and their sizes on disk
ALTER PROCEDURE [dbo].[sp_Table_Sizes]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
DECLARE @table_name VARCHAR(500)  
DECLARE @schema_name VARCHAR(500)  
DECLARE @tab1 TABLE( 
        tablename VARCHAR (500) collate database_default 
       ,schemaname VARCHAR(500) collate database_default 
) 

CREATE TABLE #temp_Table ( 
        tablename sysname 
       ,row_count INT 
       ,reserved VARCHAR(50) collate database_default 
       ,data VARCHAR(50) collate database_default 
       ,index_size VARCHAR(50) collate database_default 
       ,unused VARCHAR(50) collate database_default  
) 

INSERT INTO @tab1  
SELECT Table_Name, Table_Schema  
FROM information_schema.tables  
WHERE TABLE_TYPE = 'BASE TABLE' 

DECLARE c1 CURSOR FOR 
SELECT Table_Schema + '.' + Table_Name   
FROM information_schema.tables t1  
WHERE TABLE_TYPE = 'BASE TABLE' 

OPEN c1 
FETCH NEXT FROM c1 INTO @table_name 
WHILE @@FETCH_STATUS = 0  
BEGIN   
        SET @table_name = REPLACE(@table_name, '[','');  
        SET @table_name = REPLACE(@table_name, ']','');  

        -- make sure the object exists before calling sp_spacedused 
        IF EXISTS(SELECT id FROM sysobjects WHERE id = OBJECT_ID(@table_name)) 
        BEGIN 
               INSERT INTO #temp_Table EXEC sp_spaceused @table_name, false; 
        END 

        FETCH NEXT FROM c1 INTO @table_name 
END 
CLOSE c1 
DEALLOCATE c1 

SELECT  t1.* 
       ,t2.schemaname  
FROM #temp_Table t1  
INNER JOIN @tab1 t2 ON (t1.tablename = t2.tablename ) 
ORDER BY schemaname,t1.tablename; 

DROP TABLE #temp_Table
END
Run Code Online (Sandbox Code Playgroud)

  • 如果您发布代码,XML或数据示例,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(`{}`),以很好地格式化和语法突出显示它! (2认同)

Ard*_*oli 5

要在一个数据库中获取所有表大小,您可以使用以下查询:

Exec sys.sp_MSforeachtable ' sp_spaceused "?" '
Run Code Online (Sandbox Code Playgroud)

您可以更改它以将所有结果插入临时表,然后从临时表中选择。

Insert into #TempTable Exec sys.sp_MSforeachtable ' sp_spaceused "?" ' 
Select * from #TempTable
Run Code Online (Sandbox Code Playgroud)


Anj*_*ant 5

这是一种通过以下步骤快速获取所有表大小的方法:

  1. 编写给定的T-SQL 命令以列出所有数据库表:

    select 'exec sp_spaceused ' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在复制数据库表的列表,并将其复制到一个新的查询分析器窗口中

    exec sp_spaceused table1
    exec sp_spaceused table2
    exec sp_spaceused table3
    exec sp_spaceused table4
    exec sp_spaceused table5
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在SQL查询分析器,从顶部工具栏选项中选择结果以文件Ctrl+ Shift+ F)。

  4. 现在终于点击了上面工具栏中标记为红色的Execute按钮。

  5. 所有表的数据库大小现在都存储在您计算机上的文件中。

    在此处输入图片说明