在不使用 Count 函数的情况下检索行数

Dee*_*ons 4 sql-server-2005 count select

我在下面写了一个查询,它给我一个语法错误,为什么会这样做,

SELECT MAX('Row') FROM 

(SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) 'Row' FROM USERS)
Run Code Online (Sandbox Code Playgroud)

错误描述:

Incorrect syntax near ')'.
Run Code Online (Sandbox Code Playgroud)

我不明白:(

gbn*_*gbn 21

  • 如果您想以有效的方式获得准确的行数,那么COUNT(*)就是这样。在ANSI标准(查找“ Scalar expressions 125“),国家COUNT(*)给一个表的行数:它的目的是从一开始就进行了优化。

如果指定了 COUNT(*),则结果是 T 的基数。

  • ROW_NUMBER() 函数不是一个实用的选项:它不是一个计数函数(它是“ROW_NUMBER”)并且在您添加行时它会运行得很糟糕:几个 1000 将显示它有多糟糕

  • SUM(1) 可以在内部优化为 COUNT(*) 但我永远不会使用它

  • @@ROWCOUNT 将要求第一个 SELECT 返回所有行,这是一个巨大的不必要的开销。

如果您可以使用 SQL Server 的近似值,则使用 sys.dm_db_partition_stats。自从 SQL Server 2005 添加 dmvs 以来,玛丽安的答案现在已经过时了

SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
    object_name(object_id) = 'Mytable' AND (index_id < 2)
Run Code Online (Sandbox Code Playgroud)

也可以在 SO 上查看更多信息:https : //stackoverflow.com/questions/6069237/fastest-way-to-count-exact-number-of-rows-in-a-very-large-table/6069288# 6069288

总之,只有一种有用的方法可以获取表中的行数。数数(*)


RTh*_*mas 15

查询实际上存在三个问题。第一个是Max('Row')将返回字符串 'Row'。第二个是您的子查询需要别名。

像这样尝试:

 SELECT MAX(Row) FROM 
 (SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) Row FROM USERS) UserQuery
Run Code Online (Sandbox Code Playgroud)

第三个问题是,这count()是一种更好的方法,正如 gbn的回答中所描述的那样。

另请注意,这ROW是在保留关键字列表中,因此也应避免使用。


Mar*_*ian 6

还有另一种变体,不扫描表,使用系统表:

Select si.RowCnt
from sys.objects so join sysindexes si on si.id = so.object_id
where so.type_desc = 'USER_TABLE'
and si.indid in (0,1) -- heap or clustered index
and so.Name in ('Users')
Run Code Online (Sandbox Code Playgroud)

比较计划、持续时间、时间......你会发现它是一个更快的变体。

  • 大概这并没有给出*确切*计数? (3认同)