sql在给定阈值处停止计数

时间:2011-03-29 15:32:09

标签: java sql sql-server hibernate count

我正在系统中生成报告,但有些报告会返回大量结果。为了解决这个问题,我首先使用计数命中数据库,然后在我的代码中检查此计数是否高于某个阈值(例如2000),然后不生成报告。

在大多数情况下这很好,但有些报告的结果超过一百万,这意味着返回结果需要几秒钟的时间。

理想情况下,我想做的是将我的阈值(2000)放入我的sql语句中,如果达到此值则停止计数,并返回一些值(例如true或false,0或1,任何东西),以便我知道它超出了它的极限。这在sql中是否可行,到目前为止我找不到解决方案。

伪代码:从表中选择count(1),而count< = threshold

我正在使用java,hibernate,sql server 2005。

非常感谢任何帮助。

此致

埃蒙

4 个答案:

答案 0 :(得分:1)

我认为这样的事情应该有效:

select count(1) from (
  select top 2000 *
    from table
   where ...
)

答案 1 :(得分:1)

我不喜欢两次运行查询的想法,一次检查行计数然后再次实际获取数据。因此,如果要将报告限制为2000行,只需执行以下操作:

SELECT TOP 2001
  ...
  from...

在应用程序中检查rowcount是否大于您的限制>2000返回错误,或跳过显示错误。

答案 2 :(得分:0)

尝试类似限制条款?这个页面建议如何在sql server中完成:http://blogs.msdn.com/b/sqlserver/archive/2006/10/25/limit-in-sql-server.aspx

答案 3 :(得分:0)

我真的不知道Hibernate for TOP指令中的等价物,但即使首先存在,你也必须检索2000行,然后计算它可能会像现在一样慢。所以你可以使用allredy 2001 row,然后在应用程序中验证它。

但我认为你应该优化的是查询本身。 如果在查询中不存在某些外连接,则只在语句

中指定索引列
SELECT count(*) from test1 inner join test2 on test1.id = test2.id;

888 ms

SELECT count(test.id) from test1 inner join test2 on test1.id = test2.id;

88ms

关系test1中的35行与test2中的1匹配;

行1252080;