作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现在使用集合作为选择条件时设计 JDBC/JPA 查询时,这种情况很常见。
假设有一个包含 50,000 条记录的表,其字段 order_id
已正确索引。现在 java 应用程序有一个包含 500 个订单 ID 的列表来查找订单详细信息,并且需要为每个订单对象分配值。所以可以有两种方案
1. run 500 SELECT queries
for(String id:order_ids){
Order order = QueryAgent.execute("SELECT * FROM ORDES o WHERE o.order_id ="+id);
modifyOrder(order);
}
2. run one query whith 500 parameters in
String orders_in_string = getOrdersInString(order_ids);
List<Order> orders = QueryAgent.execute("SELECT * FROM ORDES o WHERE o.order_id IN ="+orders_in_string);
for(Order order:orders){
modifyOrder(order);
}
我不知道哪个性能更好。
最佳答案
这两个查询将返回相同数量的结果。因此,您真正的问题是哪个更快:运行 500 个小查询或一个大查询以获得相同的结果。
性能问题的正确答案是鼓励您在您的系统上尝试它,看看在您的环境中哪个对您的数据更快。
在这种情况下,有充分的理由期望单个查询会更快。 SQL 会在解析查询(或查找已解析的等效查询)、启动查询和准备结果时产生开销。所有这些在每个查询中发生一次。因此,我希望一个查询会更快。
如果 order_id
的列表已经来自数据库,我会建议构建一个更复杂的查询,这样他们就不必返回到应用程序。像这样的东西:
select o.*
from orders o
where o.order_id in (select . . . );
另外,如果您不需要所有的列,您应该明确地选择您想要的列。实际上,在所选择的列中始终明确是个好主意。
关于java - 重复选择或使用 IN 子句,哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232462/
我是一名优秀的程序员,十分优秀!