代码之家  ›  专栏  ›  技术社区  ›  MadBoy

找出SQL Server数据库中总共存储了多少行的简单方法?

  •  2
  • MadBoy  · 技术社区  · 15 年前

    我正在寻找一个简单的方法来计算一个SQL Server 2005/2008数据库中的所有行(当然跳过系统表)?我知道我可以用

    SELECT COUNT (COLUMN) FROM TABLE
    

    对每一张表都这样做,然后把它加起来,但更喜欢自动的方式吗?

    有吗?

    7 回复  |  直到 15 年前
        1
  •  3
  •   Aaron Bertrand    15 年前
    SELECT SUM(row_count)
        FROM sys.dm_db_partition_stats
        WHERE index_id IN (0,1)
        AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0;
    

    这将是准确的,除了在运行查询时在事务中添加或删除的任何行外,这可能是准确的。而且它也不会花掉打架的费用。

    但正如我在另一条评论中提到的,我不确定这如何帮助您确定数据库中的“数据量”。当然,有多少排,但是如果我有10个玻璃杯,每半杯水,而你有5个玻璃杯,每一个都满了,我们中的哪一个有更多的水?

        2
  •  2
  •   Peter Schofield    15 年前

    这是我今天回答的一个类似问题:

    SQL Server2005或更高版本提供了一个非常有用的报告,显示了表的大小(包括行数等)。它在标准报告中,它是按表使用的磁盘。

    从程序上讲,有一个很好的解决方案: http://www.sqlservercentral.com/articles/T-SQL/67624/

        3
  •  2
  •   Mark Schultheiss    15 年前

    尝试:

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

    这是索引行。这可能只是一个近似值,因为数据库会发生很大的变化,有些东西可能不会被索引,但这会很快。

    编辑:请注意,so.xtype是用户类型,假设您不需要系统内容,而只需要“真实”的数据内容。

    edit2:无火焰注意:在sysobjects表上查询可能是个坏主意:)。

    edit3:专门解决需求,没有关联连接:)

    SELECT sum(mycount) from
    (SELECT 
        MAX(si.rows) AS mycount
    FROM 
        sysobjects AS so 
        join sysindexes AS si  on si.id = OBJECT_ID(so.name) 
    
    WHERE 
        so.xtype = 'U' 
    GROUP BY 
      so.name 
    ) as mylist
    
        4
  •  1
  •   AakashM    15 年前

    我们知道 sp_spaceused 当传递一个表名时,将返回一个行计数,这样我们就可以检查它的作用-它查询 sys.dm_db_partition_stats -然后复制得到:

    SELECT
        SUM(ddps.row_count) TotalRows
    FROM
        sys.indexes i
        INNER JOIN sys.objects o ON i.OBJECT_ID = o.OBJECT_ID
        INNER JOIN sys.dm_db_partition_stats ddps ON 
            o.OBJECT_ID = ddps.OBJECT_ID
            AND i.index_id = ddps.index_id
    WHERE
        i.index_id < 2
        AND o.is_ms_shipped = 0 -- to exclude system tables
    

    但奇怪的是,我不得不说…

        5
  •  0
  •   AdaTheDev    15 年前

    您可以查询sysindexes,查看每个表上聚集索引的rowcnt值。但我不确定这到底有多新。

    或者,类似这样的事情(在一个小的测试数据库上进行短暂的测试):

    CREATE TABLE #TableRowCount (TableName NVARCHAR(128), RowCnt BIGINT)
    INSERT #TableRowCount (TableName, RowCnt) 
    EXECUTE sp_msforeachtable 'SELECT "?", COUNT(*) FROM ?'
    SELECT SUM(RowCnt) AS TotalRowCount FROM #TableRowCount
    DROP TABLE #TableRowCount
    
        6
  •  0
  •   Charles Bretana    15 年前

    签出未记录的存储过程 sp_MSForEachTable . 使用它,您可以对数据库中的每个表运行一个计数(*)。对于您的特定问题:

    EXEC sp_MSforeachtable 'SELECT ''?'', Count(*) as NumberOfRows FROM ?'
    
        7
  •  0
  •   Yada    15 年前

    我不确定旧版本的MS SQL是否具有数据字典的信息标准。

    你可以这样做:

    SELECT SUM(table_rows)
    FROM  information_schema.tables
    WHERE table_schema = 'DATABASENAME'
    
    推荐文章