Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重复选择或使用IN子句,哪个更快?_Java_Sql_Oracle_Jakarta Ee_Jpa - Fatal编程技术网

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

Java 重复选择或使用IN子句,哪个更快?,java,sql,oracle,jakarta-ee,jpa,Java,Sql,Oracle,Jakarta Ee,Jpa,我发现,当使用集合作为where条件进行选择时,在设计JDBC/JPA查询时,这种情况很常见 假设有一个包含50000条记录的表,其字段order\u id已正确索引。现在,java应用程序有一个500个订单ID的列表,用于查找订单详细信息,并需要为每个订单对象分配值。所以可以有两个计划 1. run 500 SELECT queries for(String id:order_ids){ Order order = QueryAgent.execute("SELECT * FROM

我发现,当使用集合作为where条件进行选择时,在设计JDBC/JPA查询时,这种情况很常见

假设有一个包含50000条记录的表,其字段
order\u 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);
}
1。运行500个选择查询
for(字符串id:订单id){
Order Order=QueryAgent.execute(“从ORDES o中选择*,其中o.Order_id=“+id”);
修改订单(订单);
}
2.运行一个包含500个参数的查询
String orders\u in\u String=getOrdersInString(订单ID);
List orders=QueryAgent.execute(“从ORDES o中选择*,其中o.order_id IN=“+orders_IN_字符串”);
对于(订单:订单){
修改订单(订单);
}

我不知道哪一个查询的性能更好。

这两个查询将返回相同数量的结果。所以,真正的问题是哪个更快:运行500个小查询还是一个大查询以获得相同的结果

对性能问题的正确答案是鼓励您在系统上尝试,看看在您的环境中,哪一个在数据上更快

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

如果
order\u id
s的列表已经来自数据库,我建议构建一个更复杂的查询,这样它们就不必返回应用程序。比如:

select o.*
from orders o
where o.order_id in (select . . . );

此外,如果不需要所有列,则只需显式选择所需的列。实际上,在所选列中始终显式是一个好主意。

这两个查询将返回相同数量的结果。所以,真正的问题是哪个更快:运行500个小查询还是一个大查询以获得相同的结果

对性能问题的正确答案是鼓励您在系统上尝试,看看在您的环境中,哪一个在数据上更快

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

如果
order\u id
s的列表已经来自数据库,我建议构建一个更复杂的查询,这样它们就不必返回应用程序。比如:

select o.*
from orders o
where o.order_id in (select . . . );

此外,如果不需要所有列,则只需显式选择所需的列。实际上,在所选的列中始终显式是一个好主意。

如果您需要基准测试,请先检查in语句中是否可以有500个参数。第二种方法是只检索必要的数据,第三种方法是尝试准备好的语句。
但是,如果有机会让数据库在一个或两个查询中选择500个订单ID,请尝试联接表或子选择数据。这就是关系数据库的用途。

如果您需要基准测试,请先检查in语句中是否可以有500个参数。第二种方法是只检索必要的数据,第三种方法是尝试准备好的语句。
但是,如果有机会让数据库在一个或两个查询中选择500个订单ID,请尝试联接表或子选择数据。这就是关系数据库的用途。

您是否尝试过对这两种方法进行基准测试?运行每个查询几千次,并计算每个查询所需的时间。然后你就知道哪个更快了。不要通过添加东西来创建查询字符串。使用参数化查询。了解sql注入您是否尝试过对这两种方法进行基准测试?运行每个查询几千次,并计算每个查询所需的时间。然后你就知道哪个更快了。不要通过添加东西来创建查询字符串。使用参数化查询。阅读sql注入您可以有500个参数,1000个受支持。您可以有500个参数,1000个受支持。这很有意义。不幸的是,我们是由JPA设计应用程序的,所以查询创建没有那么灵活。这个问题中的例子只是一个例子。非常感谢。这是有道理的。不幸的是,我们是由JPA设计应用程序的,所以查询创建没有那么灵活。这个问题中的例子只是一个例子。非常感谢。