JPA 性能 - SELECT DISTINCT and/or Java 集
JPA performance - SELECT DISTINCT and/or Java Set
我有一个带有 JpaRepository 的 Spring 启动应用程序。我现在正在尝试 获取我的数据库中某个字段的所有唯一值 。
假设我有一个对象 Foo
,它有一个整数主键 id
和一个非唯一整数字段 bar
。我想获取 bar
的所有唯一值,我想知道以下哪个查询最有效:
- 在
SELECT
语句中使用 DISTINCT
并将结果存储在列表中。
@Query("select distinct f.bar from Foo f")
List<Integer> getUniqueBar();
- 在
SELECT
中使用 DISTINCT
并将结果存储在一个 Set 中。
@Query("select distinct f.bar from Foo f")
Set<Integer> getUniqueBar();
- 不要在 select 中使用
DISTINCT
并将结果存储在 Set 中。
@Query("select f.bar from Foo f")
Set<Integer> getUniqueBar();
所有 3 个查询都产生相同的结果。哪个效率最高?
IMO,它应该是 1,因为它在数据库中进行了重复过滤,但我不确定在 Set 上使用 List 是否会带来很多好处。
(我对存储结果的实际容器不感兴趣,只要它是 Collection
。)
选项 1 或 2 最适合性能,选项 3 将 return 来自 table 的所有栏,甚至是重复值。我猜你看不到数据库中重复值的原因是因为你将结果映射到一个不能包含重复项的集合。如果我们谈论选项 1 与选项 2 的性能比较,我会说这实际上取决于您将使用这些集合的目的。例如看这个问题:Performance and Memory allocation comparison between List and Set.
我会选择选项 2,以便在数据库中进行过滤,并在代码中明确表示此集合中不应有重复项。
我有一个带有 JpaRepository 的 Spring 启动应用程序。我现在正在尝试 获取我的数据库中某个字段的所有唯一值 。
假设我有一个对象 Foo
,它有一个整数主键 id
和一个非唯一整数字段 bar
。我想获取 bar
的所有唯一值,我想知道以下哪个查询最有效:
- 在
SELECT
语句中使用DISTINCT
并将结果存储在列表中。
@Query("select distinct f.bar from Foo f")
List<Integer> getUniqueBar();
- 在
SELECT
中使用DISTINCT
并将结果存储在一个 Set 中。
@Query("select distinct f.bar from Foo f")
Set<Integer> getUniqueBar();
- 不要在 select 中使用
DISTINCT
并将结果存储在 Set 中。
@Query("select f.bar from Foo f")
Set<Integer> getUniqueBar();
所有 3 个查询都产生相同的结果。哪个效率最高?
IMO,它应该是 1,因为它在数据库中进行了重复过滤,但我不确定在 Set 上使用 List 是否会带来很多好处。
(我对存储结果的实际容器不感兴趣,只要它是 Collection
。)
选项 1 或 2 最适合性能,选项 3 将 return 来自 table 的所有栏,甚至是重复值。我猜你看不到数据库中重复值的原因是因为你将结果映射到一个不能包含重复项的集合。如果我们谈论选项 1 与选项 2 的性能比较,我会说这实际上取决于您将使用这些集合的目的。例如看这个问题:Performance and Memory allocation comparison between List and Set.
我会选择选项 2,以便在数据库中进行过滤,并在代码中明确表示此集合中不应有重复项。