数据映射优化:X数据库查询与Y Java if语句
目前,我们从Spring SimpleJdbcTemplate检索对象列表。第一个查询是select*以检索我们希望成为“密钥”的所有记录。然后,这将导致集合上的foreach循环,该循环又涉及到返回数据库的N个查询,其中N是列表的大小。执行这N个查询或执行2个大型select*语句并通过执行if语句的for循环映射它们会更有效吗?见下面的代码:数据映射优化:X数据库查询与Y Java if语句,java,sql,performance,Java,Sql,Performance,目前,我们从Spring SimpleJdbcTemplate检索对象列表。第一个查询是select*以检索我们希望成为“密钥”的所有记录。然后,这将导致集合上的foreach循环,该循环又涉及到返回数据库的N个查询,其中N是列表的大小。执行这N个查询或执行2个大型select*语句并通过执行if语句的for循环映射它们会更有效吗?见下面的代码: N Queries List keyList = Select * from keyTable; for(Object o: keyList)
N Queries
List keyList = Select * from keyTable;
for(Object o: keyList)
{
List valueList = Select * from valueTable;
//Map valueTable to keyTable via rowmapper
}
Y Java if statements
List keyList = Select * from keyTable;
List valueList = Select * from valueTable;
for(Object o: keyList)
{
for(Object z : valueList)
{
if(z.key == o.key) //set the value
}
}
我不是java程序员,但是让数据库执行连接不是更简单吗?因为大多数现代数据库引擎的设计和构建都是为了优化连接过程?猜猜语法,你就会得到这个查询
Select * from keyTable o
inner join valueTable z
on o.key = z.key
在您的代码中,可能是这样:
List keyValueList = select * from keyTable o inner join valueTable z on o.key = z.key;
我不是java程序员,但是让数据库执行连接不是更简单吗?因为大多数现代数据库引擎的设计和构建都是为了优化连接过程?猜猜语法,你就会得到这个查询
Select * from keyTable o
inner join valueTable z
on o.key = z.key
在您的代码中,可能是这样:
List keyValueList = select * from keyTable o inner join valueTable z on o.key = z.key;
您应该使用sql联接或子查询在单个sql语句中检索所有数据。这将允许数据库利用可能可用的任何优化机制(索引和执行计划、缓存等) 使用sql连接:
select key,value from keyTable k, valueTable v where k.key=v.key
使用子查询(仅当键具有唯一值时):
您应该使用sql联接或子查询在单个sql语句中检索所有数据。这将允许数据库利用可能可用的任何优化机制(索引和执行计划、缓存等) 使用sql连接:
select key,value from keyTable k, valueTable v where k.key=v.key
使用子查询(仅当键具有唯一值时):
您的选项依次为:
- 让数据库进行连接。这是迄今为止最好的选择,几乎没有理由不这样做:
- 如果出于任何原因需要在应用程序级别执行联接,valueTable.key上有一个索引,并且您期望的结果很少,请执行嵌套循环联接:
- 对于嵌套循环联接未涵盖的情况,执行哈希联接:
- 最后,你可以试试
- 让数据库进行连接。这是迄今为止最好的选择,几乎没有理由不这样做:
- 如果出于任何原因需要在应用程序级别执行联接,valueTable.key上有一个索引,并且您期望的结果很少,请执行嵌套循环联接:
- 对于嵌套循环联接未涵盖的情况,执行哈希联接:
- 最后,你可以试试