AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 55368
Accepted
Cylindric
Cylindric
Asked: 2013-12-21 04:45:18 +0800 CST2013-12-21 04:45:18 +0800 CST 2013-12-21 04:45:18 +0800 CST

列出所有数据库上所有表的表大小

  • 772

有没有一种简单的方法可以列出 MSSQL 服务器上每个数据库中每个表的大小?

我在 sys.tables 上使用了一个查询来获取单个数据库的结果,但我们每台服务器有 >100 个数据库,因此获得相同结果但适用于所有数据库的方法会很棒。

目前,我必须从 master.sys.databases 创建一个临时数据库列表,然后使用游标对其进行迭代,构建查询并将结果插入到带有 .sys 的临时表中EXEC sp_executeSQL @SQLString。

sql-server
  • 6 6 个回答
  • 44081 Views

6 个回答

  • Voted
  1. Best Answer
    user507
    2013-12-21T06:21:58+08:002013-12-21T06:21:58+08:00

    如果您想在您的所有环境中为您的所有数据库获得此功能...并且您不介意使用 PowerShell...您将需要从至少安装了 SQL Server 2008 Management Studio 的机器上运行它。

    
    # Load SMO
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
    
    function Get-TableSize ([string[]]$server) {
        foreach ($srv in $server) {
            $s = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $srv
    
            $s.Databases.Tables | 
                ? {-Not $_.IsSystemObject} | 
                    Select @{Label="Server";Expression={$srv}},
                        @{Label="DatabaseName";Expression={$_.Parent}}, 
                        @{Label="TableName";Expression={$_.Name}}, 
                        @{Label="SizeKB";Expression={$_.DataSpaceUsed}}
        }
    }

    如标记为DataSpaceUsed“KB”的 SMO 对象输出,您可以将其修改为您选择的度量,只需为其添加缩写参考即可。所以如果我想要 "MB": $_.DataSpaceUsed/1MB。

    在函数([string[]]$server)中,括号“[]”表示参数接受一个对象数组。因此,如果您在文件中列出了服务器,则可以像这样调用该函数:

    
    $list = get-content .\ServerList.txt
    Get-TableSize -server $list | Out-GridView
    

    我更喜欢Out-GridView最初使用来查看输出,它可以轻松地直接复制到 Excel 中。如果需要,您还可以将其输出到其他受支持的 PowerShell 格式。

    以屏幕截图为例,您也可以只列出服务器: 在此处输入图像描述

    • 7
  2. rolfl
    2013-12-21T05:34:24+08:002013-12-21T05:34:24+08:00

    取自 Stack-Overflow:获取数据库中所有表的大小

    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 
        t.Name
    
    • 5
  3. Fer R
    2015-06-25T07:38:16+08:002015-06-25T07:38:16+08:00

    我使用了以前答案的合并:

    USE [master];
    GO
    
    sp_msforeachdb 'USE [?]; 
    SELECT  
    ''?'' as db,    
    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    p.rows > 0 AND t.is_ms_shipped = 0    AND i.OBJECT_ID > 255 
    GROUP BY     t.Name, s.Name, p.Rows 
    ORDER BY p.rows DESC' ;
    
    • 2
  4. Kenneth Fisher
    2013-12-21T05:30:34+08:002013-12-21T05:30:34+08:00

    但是,您可以尝试使用sp_msforeachdb一些警告。

    • 您正在使用动态 SQL,所以它可能有点棘手
    • 它没有记录且不受支持,因此可能会在任何版本中更改或消失
    • 它有一些已知的缺陷,包括快照问题和跳过奇数数据库

    话虽如此,我已经成功使用了几年。

    sp_msforeachdb 'USE [?]; SELECT * FROM sys.tables'
    

    基本上它在 ? 与数据库名称。

    您也可以尝试 Aaron Bertrand 的替换版本。 我自己没有尝试过,但应该会更好。

    • 1
  5. FMA
    2019-09-01T14:57:41+08:002019-09-01T14:57:41+08:00

    以下将解决您的问题:

    use master
    DECLARE @xQry NVARCHAR(MAX)=''
    SELECT @xQry+= ' UNION ALL SELECT '''+name+''' COLLATE Modern_Spanish_CI_AS AS [Database], 
        schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS AS [table], 
            cast(sum(spc.used_pages * 8)/1024.00 as numeric(36, 2)) as used_mb,
            cast(sum(spc.total_pages * 8)/1024.00 as numeric(36, 2)) as allocated_mb
        from '+name+'.sys.tables tab
        join '+name+'.sys.indexes ind 
             on tab.object_id = ind.object_id
        join '+name+'.sys.partitions part 
             on ind.object_id = part.object_id and ind.index_id = part.index_id
        join '+name+'.sys.allocation_units spc
             on part.partition_id = spc.container_id
        group by schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS'
    FROM sys.databases 
    
    SET @xQry= RIGHT(@xQry,LEN(@xQry)-11) + ' order by 3 desc'
    EXEC (@xQry)
    
    • 0
  6. pabeilke
    2021-07-08T12:07:11+08:002021-07-08T12:07:11+08:00

    类似于 Fer R 的答案,但合并为一个结果集。与 sp_MSforeachdb 相关的警告适用。

    set nocount on
    
    USE [master];
    GO
    
    if object_id('tempdb..#temp') is not null drop table #temp
    
    CREATE TABLE #temp(
        rec_id      int IDENTITY (1, 1),
        db sysname, 
        TableName   varchar(128),
        SchemaName varchar(128),
        RowCounts   bigint,
        TotalSpaceMB    decimal(15,2),  
        UsedSpaceMB decimal(15,2),
        UnusedSpaceMB   decimal(15,2)   )
    
    
    exec sp_MSforeachdb 'USE [?]; 
    insert into #temp (db, TableName, SchemaName, RowCounts, TotalSpaceMB, UsedSpaceMB, UnusedSpaceMB)
    SELECT  
    ''?'' as db,    
    t.NAME AS TableName,    
    s.Name AS SchemaName,    
    p.rows AS RowCounts,    
    SUM(a.total_pages) * 8/1024 AS TotalSpaceMB,     
    SUM(a.used_pages) * 8/1024 AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8/1024 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    p.rows > 0 AND t.is_ms_shipped = 0    AND i.OBJECT_ID > 255 
    GROUP BY     t.Name, s.Name, p.Rows 
    ORDER BY p.rows DESC' ;
    
    select db, TableName, SchemaName, RowCounts, TotalSpaceMB, UsedSpaceMB, UnusedSpaceMB
    from #temp
    order by db, SchemaName, TableName
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve