【问题标题】:I can replace a query with java code, is it better? [closed]我可以用java代码替换查询,更好吗? [关闭]
【发布时间】:2020-02-24 11:43:19
【问题描述】:

我必须清点物品。

使用 count 进行选择是否更好,以便 db(postgreSQL) 可以快速执行它或访问 java 中的每个对象并对其进行计数?

在一种方式中,我需要再访问一次数据库,但在另一种方式中,我将循环大量对象。

考虑到应用程序是企业级的,所以我可以拥有数千个对象。

我需要最好的解决方案来优化它。

【问题讨论】:

  • 让数据库完成这项工作...大多数已经针对那个工作进行了优化,数据传输也少得多(我知道,这并不总是正确的,但很可能会计数)
  • 这取决于.....
  • 你在这里的问题太宽泛了。对此没有一般性的答案,只有随着时间的推移进行生产分析才能显示哪个更可取。甚至没有对您的开发进行分析,因为这将有不同的表统计信息、不同的执行计划等等。
  • 如果您存储项目的对象/列表/集合没有某种countlength 方法来立即检索它,那么您可能使用了错误的类型对象/列表/集合 - 即您已经应该在内存中拥有该信息。
  • 另外,企业级的“千”是相当低的。有的有几千万。如果您不打算将它们用于计数以外的任何用途,那么当您可以拉单个 LONG 时,将它们通过网络拉到您的应用服务器是没有用的。如果您担心两次数据库往返,只需使用多个结果集进行查询,其中一个是 count,另一个是您实际使用的任何结果。

标签: java sql postgresql optimization


【解决方案1】:

如果您已经在获取所有行,那么简单地从中获取最大行号可能更有意义。

通常我会让数据库完成这项工作,但在您的情况下,如果它与您为获取所有行并获取计数而触发的查询完全相同,则它可能是来自 java 的简单计数。

如果您使用的是 java sql 结果集,您可以直接将光标移动到最后一个条目并获取其行号/计数。因此,您无需在 Java 中循环您的结果集即可获得总数

int size = 0;
try {
    resultSet.last();
    size = resultSet.getRow();
}
catch(Exception ex) {
    return 0;
}
return size;

虽然 DB 会及时执行和处理查询,但如果连接不可用并使用 create/prepared 语句以获得更好的性能,则会产生成本。因此,了解您的流程配件需要什么才能使其成为高效的应用程序非常重要。

【讨论】:

  • 他不是在问“我怎么算”。他在问“我应该用 Java 还是 SQL 计算”。
  • 我的错我觉得最好不要在这里发送另一个数据库查询。我还发布了一个示例,正如他提到的迭代结果集以获取计数“.....但在另一个我将循环很多对象”。添加了更多关于这一点的信息
  • 我们不知道他是否获取了所有行 - 他说他认为服务器可以处理它。
  • 我明白你的意思。
【解决方案2】:

@CarlosHeuberger 的评论很贴切,但各方面:

  • 数据库可以做得更快;有元数据;可以遍历索引。
  • 数据库缓存。 (并发和重复调用。)
  • 数据传输较少。
  • 无需创建 java 对象,即使它们只是属于 ResultSet。
  • Java 代码可能需要更多时间仔细阅读(维护)。

我不认为这里是这种情况,阅读问题。但是对于其他人:

  • 搜索计数以插入 id count + 1 的新记录是一个巨大的 NO。不安全,存在更好的机制。

如果您为分页执行此操作,则无需预先加载所有记录。

【讨论】:

  • 关于分页:我开始认为marker-based 分页通常比偏移分页更好,假设有一个自然的标准来构建它。
  • @M.Prokhorov 确实,虽然工作量和所需的代码(太大),但可以制作一个可重用的组件。
【解决方案3】:

你使用一些 DAO 吗?在 hibernate 中,您可以使用 HQL,它被转换为指定的 SQL 语法。您不必将 Java 代码与一个数据库版本严格耦合,让 hibernate 完成这项工作。 无论如何,IMO 你在标签上犯了错误,JQuery 没有连接到 Java,它是 JavaScript 脚本。

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 2015-03-20
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多