如何使用sys.partitions计算SQL SERVER 2012中的行

时间:2014-09-18 09:59:02

标签: sql-server count

我尝试实现一些更快的计算行号的方法,而不是我现在正在使用的COUNT()。然而,即使我用一个简单的例子来了解如何使用sys.partitions能力,我也无法得到我期望的结果。

我有表格[[dbo]。[客户],我只是通过以下方式获取表格中的记录数:

SELECT COUNT(*) FROM [dbo].[Client]

结果是:

(No column name)
40306

现在我正在尝试使用我在网上找到并修改它以匹配我的表的示例来计算同一个表中的记录使用sys.partitions

SELECT
sch.name AS dbo,
SysTab.Name AS Client,
sch.name + '.' + SysTab.name AS QualifiedName,
SUM(
CASE
WHEN (Parti.index_id < 2) AND (alloUni.type = 1) THEN Parti.rows
ELSE 0
END
) AS Rows
FROM sys.partitions AS Parti
INNER JOIN sys.allocation_units AS alloUni ON Parti.partition_id = alloUni.container_id
INNER JOIN sys.tables AS SysTab ON SysTab.object_id = Parti.Object_ID
INNER JOIN sys.schemas AS sch ON sch.schema_id = SysTab.schema_id
GROUP BY SysTab.name, sch.name

即使我得到了结果,但这里有两个问题。结果是:

dbo Client                  QualifiedName              Rows
dbo MSreplication_options   dbo.MSreplication_options   3
dbo spt_fallback_db         dbo.spt_fallback_db         0
dbo spt_fallback_dev        dbo.spt_fallback_dev        0
dbo spt_fallback_usg        dbo.spt_fallback_usg        0
dbo spt_monitor             dbo.spt_monitor             1
dbo spt_values              dbo.spt_values              2508

首先 - 我真的不知道这整个数据到底是什么,我的SQL知识非常温和但我想开始使用更快的计数,因为有时对于非常大的表我会得到很大的延迟对于这个动作而且,实际上看到结果我没有看到任何可以用来获得COUNT(*)返回的实际计数以及我实际需要的数据。

简而言之 - 对于我来说,没有任何这些信息是无用的,我会骗取类似于调用COUNT(*)的输出。

2 个答案:

答案 0 :(得分:3)

试试这个:

SELECT 
    TableName = OBJECT_SCHEMA_NAME(t.object_id) + '.' + t.Name,
    RowCount = p.rows
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
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
ORDER BY 
    t.Name

更新:如果您想获取特定表的值,请替换

WHERE 
    t.NAME NOT LIKE 'dt%' 

使用您想要的任何表名:

WHERE 
    t.object_id = OBJECT_ID('[MyDBName].[dbo].[Client]')

答案 1 :(得分:1)

您可以使用:

SQL Server 2005/2008

SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc

SQL Server 2000

SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc

Source

但是,我应该注意,这种语法不是标准的,取决于您的数据库类型和数据库版本(即您将锁定您的应用程序以仅在特定的供应商数据库版本中运行。)

为了保持数据库兼容性,您应该坚持使用标准COUNT(*)聚合。