重复选择或使用IN子句,哪个更快?

Dre*_*mer 1 java sql oracle jpa java-ee

我发现当使用集合作为选择条件时,设计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);
}
Run Code Online (Sandbox Code Playgroud)

我不知道哪一个获得了更好的表现.

Gor*_*off 6

这两个查询将返回相同数量的结果.因此,您真正的问题是哪个更快:运行500个小查询或一个大型查询以获得相同的结果.

对性能问题的正确答案是鼓励您在系统上进行尝试,并在您的环境中查看哪些数据更快.

在这种情况下,完全有理由期望单个查询更快.SQL在解析查询(或查找已解析的等效查询),启动查询和准备结果时会产生开销.所有这些都发生每个查询一次.所以,我希望一个查询更快.

如果order_ids 的列表已经来自数据库,我建议构建一个更复杂的查询,这样他们就不必返回应用程序了.就像是:

select o.*
from orders o
where o.order_id in (select . . . );
Run Code Online (Sandbox Code Playgroud)

此外,如果您不需要所有列,则应该明确选择所需的列.实际上,在所选列中始终明确是一个好主意.