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

时间:2011-06-14 15:33:09

标签: java sql performance

目前,我们从Spring SimpleJdbcTemplate中检索对象列表。第一个查询是select *来检索我们想要成为“密钥”的所有记录。然后,这导致在集合上的foreach循环,其反过来涉及N个查询返回到数据库,其中N是List的大小。执行这些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  
             }   
        } 

3 个答案:

答案 0 :(得分:2)

我不是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;

答案 1 :(得分:1)

您的选择是:

  • 让数据库进行连接。这是到目前为止的最佳选择,而且几乎没有理由不这样做:
    select k.key, v.value from keyTable k, valueTable v where k.key=v.key
  • 如果由于某种原因你需要在应用程序级别进行连接,那么valueTable.key上有一个索引,你希望得到的结果很少,嵌套循环加入
    List keyList = Select key from keyTable;
    for (Object k: keyList) {  
        List valueList = Select value from valueTable where key = k;
        for (Object v: valueList) {
            // Your code here
        }
    }
  • 对于嵌套循环连接未涵盖的情况,请执行散列连接
    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
        }
    }

答案 2 :(得分:0)

您应该使用sql join或子​​查询在单个sql语句中检索所有数据。这将允许数据库利用可能可用的任何优化机制(索引和执行计划,缓存等)。

使用sql join:

select key,value from keyTable k, valueTable v where k.key=v.key

使用子查询(仅当键具有唯一值时):

select key, (select value from valueTable where key=k.key) from keyTable k