我正在系统中生成报告,但有些报告会返回大量结果。为了解决这个问题,我首先使用计数命中数据库,然后在我的代码中检查此计数是否高于某个阈值(例如2000),然后不生成报告。
在大多数情况下这很好,但有些报告的结果超过一百万,这意味着返回结果需要几秒钟的时间。
理想情况下,我想做的是将我的阈值(2000)放入我的sql语句中,如果达到此值则停止计数,并返回一些值(例如true或false,0或1,任何东西),以便我知道它超出了它的极限。这在sql中是否可行,到目前为止我找不到解决方案。
伪代码:从表中选择count(1),而count< = threshold
我正在使用java,hibernate,sql server 2005。
非常感谢任何帮助。
此致
埃蒙
答案 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;