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
是在保留关键字列表中,因此也应避免使用。
还有另一种变体,不扫描表,使用系统表:
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)
比较计划、持续时间、时间......你会发现它是一个更快的变体。