【问题标题】:Counting rows for all tables at once一次计算所有表的行数
【发布时间】:2009-01-09 15:21:31
【问题描述】:

我使用的是 SQL Server 2005,想知道如何获取所有表的列表以及每个表中的记录数。

我知道我可以使用sys.tables 视图获取表格列表,但我找不到计数。

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    从这里:http://web.archive.org/web/20080701045806/http://sqlserver2000.databases.aspfaq.com:80/how-do-i-get-a-list-of-sql-server-tables-and-their-row-counts.html

    SELECT 
        [TableName] = so.name, 
        [RowCount] = MAX(si.rows) 
    FROM 
        sysobjects so, 
        sysindexes si 
    WHERE 
        so.xtype = 'U' 
        AND 
        si.id = OBJECT_ID(so.name) 
    GROUP BY 
        so.name 
    ORDER BY 
        2 DESC
    

    【讨论】:

    • 只是出于好奇,ORDER BY 2 DESC 的作用是什么?
    • @jdl134679 它按我的 rowCount 排序,首先是行数最多的表
    • @jleach 是的,请参阅 ORDER BY 上的 docs。 "可以将排序列指定为名称或列别名,或表示列在选择列表中的位置的非负整数。"
    【解决方案2】:

    不管怎样,sysindexes 系统表在 SQL 2008 中已被弃用。上述方法仍然有效,但这里的查询将继续适用于 SQL 2008 系统视图。

    select
    schema_name(obj.schema_id) + '.' + obj.name,
    row_count
    from (
        select
            object_id,
            row_count = sum(row_count)
        from sys.dm_db_partition_stats
        where index_id < 2  -- heap or clustered index
        group by object_id
    ) Q
    join sys.tables obj on obj.object_id = Q.object_id
    

    【讨论】:

    • 这正是我想要的(在我加入了几个 WHERE 条件之后)
    【解决方案3】:

    我可能会补充说 sysindexes.rows 是行数的近似值。如果您需要更准确的值,我会运行 DBCC UPDATEUSAGE。我们在一个包含超过 47 到 5000 万行的表中遇到了这个问题,我们认为每个表都损失了大约 50 万行。

    【讨论】:

    • DBCC UPDATEUSAGE 似乎并不能解决所有潜在问题。我试过update statistics dbo.table_name with rowcount = 100000, pagecount = 100000 DBCC 修复了错误的手动设置页数,但没有修复错误的行数(但我想这是一个非常边缘的情况!)
    【解决方案4】:

    大概是这样的:

    SELECT 
        [TableName] = so.name, 
        [RowCount] = MAX(si.rows) 
    FROM 
        sysobjects so, 
        sysindexes si 
    WHERE 
        so.xtype = 'U' 
        AND 
        si.id = OBJECT_ID(so.name) 
    GROUP BY 
        so.name 
    ORDER BY 
        2 DESC
    

    http://web.archive.org/web/20080701045806/http://sqlserver2000.databases.aspfaq.com:80/how-do-i-get-a-list-of-sql-server-tables-and-their-row-counts.html

    【讨论】:

      【解决方案5】:

      这是我的方法:

      create table #rowcount (tablename varchar(128), rowcnt int)
      exec sp_MSforeachtable 
         'insert into #rowcount select ''?'', count(*) from ?'
      select * from #rowcount
          order by tablename
      drop table #rowcount
      

      像魅力一样工作

      【讨论】:

      • 它似乎比其他选项慢,但可能更准确。
      【解决方案6】:

      所有这些方法都会为您提供选择查询结果集中的行数。 SSMS 还为您提供了通过以下方式查看对象详细信息的选项:“对象资源管理器详细信息”窗格。 这适用于 2005 年及之后的所有版本

      对象资源管理器详细信息是 SQL Server Management Studio 的一个组件。它提供了服务器中所有对象的表格视图,并提供了一个用户界面来管理它们。

      要到达“对象详细信息窗口”: 在“对象资源管理器”窗格中单击要查看详细信息的对象,然后按 F7。 阅读更多:https://technet.microsoft.com/en-us/library/ms191146(v=sql.90).aspx

      优点:

      1. 比选择查询快得多,因为 SQL Server 存储此信息
      2. 无需每次都编写/复制粘贴选择查询 - 您只需按 F7 键即可
      3. 为您提供更多信息,而不仅仅是关于行数

      注意:默认情况下,对象详细信息窗格中可能没有行计数,您可以单击列标题并将其引入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多