Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
数据映射优化:X数据库查询与Y Java if语句_Java_Sql_Performance - Fatal编程技术网

数据映射优化:X数据库查询与Y Java if语句

数据映射优化: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)

目前,我们从Spring SimpleJdbcTemplate检索对象列表。第一个查询是select*以检索我们希望成为“密钥”的所有记录。然后,这将导致集合上的foreach循环,该循环又涉及到返回数据库的N个查询,其中N是列表的大小。执行这N个查询或执行2个大型select*语句并通过执行if语句的for循环映射它们会更有效吗?见下面的代码:

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
使用子查询(仅当键具有唯一值时):


您的选项依次为:

  • 让数据库进行连接。这是迄今为止最好的选择,几乎没有理由不这样做:
从键表k、值表v中选择k.key、v.value,其中k.key=v.key
  • 如果出于任何原因需要在应用程序级别执行联接,valueTable.key上有一个索引,并且您期望的结果很少,请执行嵌套循环联接:
列表键列表=从键表中选择键; 对于(对象k:keyList){ List valueList=从valueTable中选择值,其中key=k; 对于(对象v:值列表){ //你的代码在这里 } }
  • 对于嵌套循环联接未涵盖的情况,执行哈希联接:
HashMap keyHash=从键表k中选择键,k.*; List valueList=从valueType v中选择*; 对于(对象k:值列表){ if(keyHash.containsKey(k)){ //你的代码在这里 } }
  • 最后,你可以试试

您的选择顺序如下:

  • 让数据库进行连接。这是迄今为止最好的选择,几乎没有理由不这样做:
从键表k、值表v中选择k.key、v.value,其中k.key=v.key
  • 如果出于任何原因需要在应用程序级别执行联接,valueTable.key上有一个索引,并且您期望的结果很少,请执行嵌套循环联接:
列表键列表=从键表中选择键; 对于(对象k:keyList){ List valueList=从valueTable中选择值,其中key=k; 对于(对象v:值列表){ //你的代码在这里 } }
  • 对于嵌套循环联接未涵盖的情况,执行哈希联接:
HashMap keyHash=从键表k中选择键,k.*; List valueList=从valueType v中选择*; 对于(对象k:值列表){ if(keyHash.containsKey(k)){ //你的代码在这里 } }
  • 最后,你可以试试

如果不测试代码,我想这是一种方法。问题似乎是我们在调用函数时消耗了很多时间,因为函数多次接触数据库。我不确定上述方法能否解决问题,因为仍然需要进行内部映射。谢谢你的回答。你肯定想避免应用程序和数据库服务器之间的往返。第一个例子有N+1次,第二个有2次,我的想法有1次。如果往返旅行总是要花费很多时间,那么尽量减少往返(1并不比2好多少);如果处理检索到的数据需要花费所有的时间,那么您需要将重点放在优化上。同样正确。我将尝试实施您的解决方案,看看我获得了什么初步收益。目前,我们在2分钟以上的范围内,数据库中只有60个条目。如果不测试代码,我想这是一种方法。问题似乎是我们在调用函数时消耗了很多时间,因为函数多次接触数据库。我不确定上述方法能否解决问题,因为仍然需要进行内部映射。谢谢你的回答。你肯定想避免应用程序和数据库服务器之间的往返。第一个例子有N+1次,第二个有2次,我的想法有1次。如果往返旅行总是要花费很多时间,那么尽量减少往返(1并不比2好多少);如果处理检索到的数据需要花费所有的时间,那么您需要将重点放在优化上。同样正确。我将尝试实施您的解决方案,看看我获得了什么初步收益。目前,我们处于2分钟以上的范围内,数据库中只有60个条目。 HashMap keyHash = select key, k.* from keyTable k; List valueList = select * from valueType v; for (Object k: valueList) { if (keyHash.containsKey(k)) { // Your code here } }