我尝试实现一些更快的计算行号的方法,而不是我现在正在使用的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(*)
的输出。
答案 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
但是,我应该注意,这种语法不是标准的,取决于您的数据库类型和数据库版本(即您将锁定您的应用程序以仅在特定的供应商数据库版本中运行。)
为了保持数据库兼容性,您应该坚持使用标准COUNT(*)
聚合。