代码之家  ›  专栏  ›  技术社区  ›  Saroj Shrestha

在有条件的大型SQL Server表中,计算总行数的最快方法是什么?

  •  1
  • Saroj Shrestha  · 技术社区  · 6 年前

    在网上冲浪之后,我找到了一种计算SQL Server表中行总数的方法,这个方法非常快。

    SELECT 
        SUM(p.rows) 
    FROM 
        sys.partitions AS p
    INNER JOIN 
        sys.tables AS t ON p.[object_id] = t.[object_id]
    INNER JOIN 
        sys.schemas AS s ON s.[schema_id] = t.[schema_id]
    WHERE
        t.name = N'table_name'
        AND s.name = N'dbo'
        AND p.index_id IN (0,1)
    

    但是,此代码返回表的确切总行数。

    但是,在我的例子中,我正在实现软删除。所以,我想忽略那些可以用 WHERE deleted_at IS NULL .

    也就是说,删除的行将删除时间戳 deleted_at 列。

    在某些条件下,是否有一种方法可以比这更快地计算数据的总行数?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ben Thul    6 年前

    如果要考虑存储在表中的一些实际数据,显然不能使用所显示的“元数据”方法。

    如果你有一个单独的 滤波指数 在一个小的(例如 INT ) 非空的 排除要检查的条件的列。

    因此,您可以尝试添加此筛选索引:

    CREATE NONCLUSTERED INDEX IX_YourTableName_Active
        ON dbo.YourTableName(deleted_at)
        WHERE deleted_at IS NOT NULL
    

    更新: 正如@benthul正确注意到的那样-如果您有如上建议的筛选索引,当然您也可以检查此索引的元数据视图及其行数-请尝试以下操作:

    SELECT 
        SUM(p.rows) 
    FROM 
        sys.partitions AS p
    INNER JOIN
        sys.indexes i ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
    INNER JOIN 
        sys.tables AS t ON p.[object_id] = t.[object_id]
    INNER JOIN 
        sys.schemas AS s ON s.[schema_id] = t.[schema_id]
    WHERE
        t.name = N'table_name'
        AND s.name = N'dbo'
        AND i.Name = N'IX_YourTableName_Active'