Sql server 如何在SQL server中以最有效的方式确定计数是否大于阈值?

Sql server 如何在SQL server中以最有效的方式确定计数是否大于阈值?,sql-server,Sql Server,我想选择一个用户是否生成了1000多个日志。给定这些查询,我让SQLServerStudio显示估计的执行计划 select count(*) from tbl_logs where id_user = 3 select 1 from tbl_logs where id_user = 3 having count(1) > 1000 我认为第二个应该更好,因为只要SQLServer找到1000行,它就可以返回。而第一个返回实际的行数 此外,当我分析查询时,它们在读取、CPU和持续时间方

我想选择一个用户是否生成了1000多个日志。给定这些查询,我让SQLServerStudio显示估计的执行计划

select count(*) from tbl_logs where id_user = 3

select 1 from tbl_logs where id_user = 3 having count(1) > 1000
我认为第二个应该更好,因为只要SQLServer找到1000行,它就可以返回。而第一个返回实际的行数

此外,当我分析查询时,它们在读取、CPU和持续时间方面是相等的


对于我的任务,什么是最有效的查询?

我认为,通过这种方式可以实现一些性能改进:

select  1 from (
select top 1001 1 as val from tbl_logs where id_user = 3 
) cnt
having count(*) > 1000
在本例中,派生查询将仅获取前1001行(如果存在),外部查询将对计数执行逻辑检查


但是,如果表tbl_日志很小,则不会减少读取次数,因此index seek使用的索引非常小,因此只需获取很少的页面

此查询还应提高性能:

select 1 from tbl_logs order by 1 offset (1000) rows fetch next (1) rows only
当存在超过1.000行时,会得到一个1,当它们不存在时,会得到一个空数据集

它只获取前1.001行,就像Alexander的答案那样,但在这之后,它的优点是不需要重新计算已经获取的行

如果希望结果正好为1或0,则可以如下读取:

with Row_1001 as (
  select 1 as Row_1001 from tbl_logs order by 1 offset (1000) rows fetch next (1) rows only
)
select count(*) as More_Than_1000_Rows_Exist from Row_1001

运行这两个程序并比较实际执行计划。我怀疑除了第二种情况下的额外过滤之外,不会有任何真正的区别。即使在第二种情况下,服务器也必须先计算该计数,然后再将其与其他值进行比较。在
id\u user
上添加一个索引,看看它是否更快(在创建索引之前保存执行计划)。我不知道引擎是否足够智能,但我会使用
count(*)
而不是
count(val)
,即使对于子查询中硬编码的1也是如此。