在继续进行实际搜索之前对行进行计数

时间:2012-07-25 04:56:03

标签: java sql search web-search

如果有一个Web应用程序(Java,Spring,Hibernate和Sybase作为数据库),有几个,比如5个不同的搜索屏幕,我想先计算一下,如果基于用户标准的搜索结果超出限制,比如1000行。即使用户提供合理的过滤器和标准,也可能发生超过1000的巨大结果。

这样做的建议是这样的:

  1. 从表格中选择计数(*) - 这里等等
  2. 然后如果> 1000,不要做实际搜索,返回和显示限制错误(告诉用户改进搜索)
  3. else if< 1000,进行实际搜索并将结果集返回给用户
  4. 或者有更好的解决方案来处理这个问题吗?

    如果这是要走的路,我的后续问题是,我们怎样才能避免重复sql查询?因为我理解这样做,会要求我声明相同的搜索sql,除了select子句只包含count(*)。

    更新

    此外,我想避免两件事: 1.执行实际的sql处理 2.通过ORM加载/映射域对象(在本例中为Hibernate) * 1&当我检测到计数> 1时,避免使用图2所示的计数器。 1000。

3 个答案:

答案 0 :(得分:2)

我根本不会运行COUNT(*),只需使用LIMIT 1001运行查询。您可能正在生成完全相同的结果集(即,执行COUNT,您必须生成结果集),并且下一次命中将来自缓存,或者最坏的情况下您将不得不重新计算。你刚刚做了两次同样的工作

答案 1 :(得分:0)

我们也按照相同的程序进行申请。是的,唯一的区别是在SQL中放置count(1)而不是*。

但是,您可能需要了解,有时计数查询是一个花费更多时间然后获取结果子集的查询。

答案 2 :(得分:0)

根据您从行集中检索行的方式,您只需在该级别过滤结果。

int rowIndex = 0;
while (rs.hasNext() && rowIndex < 1000) {
    // ... Extract results
    rowIndex++;
}

您可能想要警告用户虽然已经修剪了结果集;)