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

Sql server 在有条件的大型SQL Server表中,计算总行数的最快方法是什么,sql-server,Sql Server,在网上冲浪之后,我找到了一种计算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'ta

在网上冲浪之后,我找到了一种计算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)
但是,此代码返回表的确切总行数

但是,在我的例子中,我正在实现软删除。因此,我想忽略那些删除的行,这些行可以使用
进行过滤,其中deleted\u at为NULL

这意味着,删除的行将在列的
deleted\u中删除时间戳


在某些条件下,有没有比这更快的方法来计算数据的总行数?

如果要考虑表中存储的一些实际数据,显然不能使用前面介绍的“元数据”方法

进行计数的最快方法可能是在一个较小的列(例如,
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'

您正在查询元数据,它显然不包含列的内容。从dbo.table\u name(其中deleted\u at为null)中选择count(*)有什么问题。目前,它大约有
56679922
行数,因此需要创建某种索引。不能直接从sys表中获取它。发布您正在运行的SQL Server版本以及您正在对数据执行的操作可能会有所帮助。这是ODS吗?我来这里是想说这一点,但是一旦过滤确实存在,就会在sys.partitions中为它添加数据,这样你就可以对它进行元数据查询了。@BenThul:你完全正确-谢谢!我已经更新了我的回复,将其包括在内information@marc_s我明白了。然而,在创建索引its
时,我的情况的确切解决方案是,其中deleted_at为NULL
,因此,我删除了
NOT
,也感谢@BenThul。在这个元数据查询之后,我的TotalRowsCount执行时间仍然是
00:00:00
@saroj-这是我的编辑,因此是我的错误。然而,现在我有一个问题:您的用例是什么?在典型场景中,软删除数据只占总数据的一小部分,因此是“选择性的”。在筛选不是很有选择性的地方创建筛选索引是不典型的。