【发布时间】:2018-12-22 18:31:57
【问题描述】:
我有一个代码,我从各种来源获取数据,并对它们进行排序和排序以发送给用户。
我通过触发一个包含多个连接到 DTO 列表的查询来获取数据,然后我再次触发另一个查询,该查询进一步包含多个连接到同一个 DTO 列表。然后我添加要呈现给用户的两个 DTO 列表。
查询 1: 从 TABLE1、TABLE2 中选择 *....
查询 2: 从 TABLE5、TABLE7 中选择 *....
dto1.addAll(dto2);
dto1.sort(Comparator....);
我以编程方式再次对其进行排序是因为以下原因:
Query 1 returned sorted data lets assume
1,2,3,4
Query 2 returned sorted data lets assume
1,2,3,4
After combining both the lists, I will get
1,2,3,4,1,2,3,4
Expected data
1,1,2,2,3,3,4,4
我的问题是,在哪种情况下性能会更好?
- 从两个查询中获取排序后的数据,添加列表,然后对它们进行排序和排序。
- 从两个查询中获取未排序的数据,添加列表,然后只排序一次。
在第一种情况下,它会被排序三次,但在第二种情况下,它只会排序和排序一次。
当我将数十万条记录放入表中进行测试时,我没有发现太大差异,第二种情况比第一种情况要快一些。
那么,在效率和性能方面,应该推荐哪一个呢?
【问题讨论】:
-
如果查询只针对一个数据库,则将查询变为一个并让 DBMS 进行排序。否则,您可以让它排序并稍后合并/排序两个结果,这应该非常有效。至少在理论上。但我不知道您使用的对象是否以及如何支持这种方法。
-
那么,在效率和性能方面,应该推荐哪一个? 执行有效基准测试时表现出更好性能的那个。真正的优化将涉及为您当前正在做的事情寻找算法上更好的解决方案。显然,一次排序应该比三次排序快 3 倍;但是您还没有真正证明这就是您的代码在这两种情况下的作用(如果您正在获取已排序的数据,为什么然后您需要再次“排序和排序”?它已经排序了)。 ..
-
FROM TABLE1, TABLE2?不要使用逗号语法来连接表。上世纪末已经过时了。请改用JOIN 语法。 -
@stickybit,正如我所提到的,我无法合并查询。此外,如果我对查询进行排序,那么在合并后,我将不得不再次对其进行排序以获得最终的 DTO。
-
您的 merge 已损坏。你已经知道这两个列表是排序的,合并两个排序的列表可以在线性时间内产生一个排序的输出。
标签: java mysql sql performance