【问题标题】:SQL query speed: multiple queries vs sorting within JavaSQL 查询速度:多个查询与 Java 中的排序
【发布时间】:2026-02-04 16:05:01
【问题描述】:

假设我有一个有 2 列的表:

  1. 城市
  2. (人名)。

我还有一个 Java“城市”对象,其中包含:

  1. 城市名称
  2. 该城市所有人的列表

所以现在我有两个选择来获取数据:

  1. 首先使用 DISTINCT 获取所有城市的列表。然后,对于每个城市,再次查询数据库,使用 WHERE 仅获取该人居住在该城市的记录。然后我可以将其存储在 City 对象中。
  2. 获取所有数据的列表,使用 ORDER BY 按城市名称排序。然后遍历所有记录并开始将它们存储在 City 对象中。当我检测到城市名称发生变化时,我可以创建一个新的 City 对象并将记录存储在其中。

以下哪种方法更快/更好?还是有比这两种方法更好的方法来获取这些信息?我正在使用 Oracle 数据库。

【问题讨论】:

  • 你在这里混合了 ORM 和原始 SQL 的东西,我无法理解你的问题。你到底想做什么?
  • 首先我会推荐用 SQL 来做这种东西,但是你为什么要进行多次查询来得到你的结果呢?一个查询似乎可行
  • 绝对是#2。请注意,您可以在 Java 代码中使用Map,而无需使用ORDER BY
  • @Henkan Question 说DISTINCTWHEREORDER BY,表示这个问题是关于SQL的,所以说“我建议用SQL做这种东西” 有点多余。 --- 此外,OP 已经在 #2 中讨论了 1-query 解决方案,所以说 “一个查询似乎可行” 有点多余。 --- 你的评论是多余的,甚至没有试图回答这个问题:哪个更好?
  • @Andreas 我想我的评论不清楚:我知道它将使用 SQL,我只是对我的意思是,如果可能的话,当然,进行返回确切所需结果的查询比得到更好一些数据,然后在代码中处理这些数据。所以这就是我推荐 SQL 的原因。

标签: java sql database


【解决方案1】:

数据库查询是一项相对昂贵的操作 - 您需要通过网络与另一台服务器进行通信,然后它可能需要访问其磁盘、计算结果、将结果返回给您等。您希望将这些操作降至最低越多越好。到目前为止,拥有一个查询并检查其结果比拥有多个查询要好得多,除非你有一些不这样做的杀手锏——这似乎不是这种情况,至少不是从你分享的信息来看.

【讨论】:

    【解决方案2】:

    排序答案是#2。您希望对数据库进行尽可能少的查询。 #2 如果我猜对了,您将加入城市/人,然后创建对象。

    更好的方法:使用 JPA/Hibernate。即检查http://www.baeldung.com/hibernate-one-to-many

    【讨论】:

    • JPA/Hibernate 不是更好的方法。
    • 这是我猜的观点。我觉得是这样的。你能解释为什么不是吗?
    • 因为仅针对问题中描述的问题添加 JPA/Hibernate 是多余的。 --- 另外,我不相信用class City { String name; List<String> personNames; } 定义CREATE TABLE city_person ( city_name VARCHAR(50), person_name VARCHAR(50) )List<City> 的映射是直截了当的。
    • 这里的关键词是“你相信”和“你不相信”。在我看来,对于现代 java 项目,bestaproach 遵循 JPA,因为我的猜测是应用程序不会简单地有两个实体。遵循您提到的映射方法可能很快就会导致他需要使用自定义比较器和整理器,因为 java 中的字符串比较将成为字典。此外,随着他的数据增长,他可能需要分页。我坚信 JPA 是对现代应用程序的改进,特别是因为他最终希望拥有 java pojos。
    【解决方案3】:

    答案编号 #2 在所有情况下都是最佳的。

    您需要用 Java 编写逻辑来区分从一个城市到下一个城市的变化。

    或者,如果您使用的是 MyBatis,则使用“集合”解决方案变得非常简单。它们执行单个数据库调用并检索您指定的整个 Java 树,包括多个级别的所有子列表。非常高效且易于编码。

    【讨论】: