我发现当使用集合作为选择条件时,设计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);
}
我不知道哪一个能获得更好的表现。
答案 0 :(得分:6)
这两个查询将返回相同数量的结果。因此,您真正的问题是哪个更快:运行500个小查询或一个大型查询以获得相同的结果。
性能问题的正确答案是鼓励您在系统上进行尝试,并了解环境中的数据哪个更快。
在这种情况下,完全有理由期望单个查询更快。 SQL在解析查询(或查找已解析的等效查询),启动查询和准备结果时会产生开销。所有这些都发生在每次查询一次。所以,我希望一个查询更快。
如果order_id
的列表已经来自数据库,我建议建立一个更复杂的查询,这样他们就不必返回应用程序了。类似的东西:
select o.*
from orders o
where o.order_id in (select . . . );
此外,如果您不需要所有列,则应该明确选择所需的列。实际上,在选择的列中始终明确是一个好主意。
答案 1 :(得分:2)
如果你做了基准测试,请首先检查一下IN语句中是否有500个args。第二次只检索必要的数据,而第三次尝试预备语句。 但是,如果您有任何机会让数据库在一个或两个查询中选择500个订单ID,请尝试连接表或子选择数据。这就是关系数据库的用途。