首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用计数函数检索行计数

问不使用计数函数检索行计数
EN

Database Administration用户
提问于 2011-07-14 05:32:36
回答 6查看 50.3K关注 0票数 4

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

代码语言:javascript
复制
SELECT MAX('Row') FROM 

(SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) 'Row' FROM USERS)

错误表:

代码语言:javascript
复制
Incorrect syntax near ')'.

我不明白:

EN

回答 6

Database Administration用户

回答已采纳

发布于 2011-07-14 07:41:33

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

就像这样:

代码语言:javascript
复制
 SELECT MAX(Row) FROM 
 (SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) Row FROM USERS) UserQuery

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

还请注意,ROW在保留关键字列表中,因此也应该避免。

票数 16
EN

Database Administration用户

发布于 2011-07-14 10:38:12

  • 如果您想以有效的方式获得行的确切计数,那么COUNT(*)就是它。ANSI标准 (查找"Scalar expressions 125")指出,COUNT(*)给出了表的行计数:从一开始就打算对其进行优化。

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

  • ROW_NUMBER()函数不是一个实用的选项:它不是一个计数函数(它是"ROW_NUMBER"),它将在添加行时运行得很糟糕:几个1000会显示它有多糟糕
  • SUM(1)可能被优化为内部计数(*),但我从未使用过它
  • @@ROWCOUNT将要求第一个SELECT返回所有行,这是一个不必要的巨大开销。

如果您可以使用近似Server,那么请使用sys.dm_db_partition_stats。玛丽安的答案现在已经过时了,因为Server 2005增加了dmvs

代码语言:javascript
复制
SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
    object_name(object_id) = 'Mytable' AND (index_id < 2)

有关更多信息,请参见下面的内容:https://stackoverflow.com/questions/6069237/fastest-way-to-count-exact-number-of-rows-in-a-very-large-table/6069288#6069288

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

票数 21
EN

Database Administration用户

发布于 2011-07-14 09:01:34

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

代码语言:javascript
复制
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')

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

票数 6
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/3849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档