2013-03-25 111 views
2

我该如何改进搜索功能?我写了一些代码来搜索某些东西。搜索花费了太多时间。和代码片段在这里,改善搜索功能

我从数据库中使用这种方法把数据,

OracleConnection connection = null; 
    OraclePreparedStatement ptmst = null; 
    OracleResultSet rs = null; 
    OracleCallableStatement cstmt = null; 
    StringBuffer strBfr = new StringBuffer(); 
    ArrayList myList = new ArrayList(); 
    try 
    {  
     connection = (OracleConnection) TransactionScope.getConnection(); 
     strBfr.append("select distinct .......... "); 
     ptmst = (OraclePreparedStatement)connection.prepareStatement(strBfr.toString());  
     rs = (OracleResultSet)ptmst.executeQuery();   
     while (rs.next()) 
       {    
       HashMap hashItems = new HashMap(); 
       hashItems.put("first",rs.getString(1)); 
       hashItems.put("second",rs.getString(2));  
       myList.add(hashItems); 
       }  

    } 
    catch (Exception e) { 
     } 
    finally { 

      try { 
       if (ptmst != null) { 
        ptmst.close(); 
       } 
      } catch (Exception e) { 
      } 

      try { 
       if (connection != null) { 
        TransactionScope.releaseConnection(connection); 
       } 
      } catch (Exception e) { 
      } 

     } 
     return myList; 

在我的jsp:

ArrayList getValues = new ArrayList();  
    getValues = //calling Method here. 
    for(int i=0; i < getValues.size();i++) 
    { 
    HashMap quoteSrch=(HashMap)allPOV.get(i);       
    first = (String)quoteSrch.get("first"); 
    second = (String)quoteSrch.get("second"); 
    } 

查询:

SELECT DISTINCT(mtl.segment1), 
    mtl.description , 
    mtl.inventory_item_id , 
    mtl.attribute16 
FROM mtl_system_items_b mtl, 
    mtl_system_items_tl k 
WHERE 1       =1 
AND mtl.organization_id   = ? 
AND k.inventory_item_id   = mtl.inventory_item_id 
AND NVL(orderable_on_web_flag,'N')= 'Y' 
AND NVL(web_status,'UNPUBLISHED') = 'PUBLISHED' 
AND mtl.SEGMENT1 LIKE ? --Here is the search term 
+0

你可以做的一件事是在数据库中使用存储过程,因此它可以优化和存储实现它的最佳方式,而不需要每次重新计算它。 – Patashu 2013-03-25 04:12:56

+1

@Patashu,这是一个准备好的声明也是如此。这是需要很长时间的查询吗?如果是这样,发布代码将无济于事,您需要查看是否可以优化查询,例如检查丢失的索引等。 – Blake 2013-03-25 04:17:37

+0

验证“TransactionScope.getConnection();'是否在每次调用时都不创建连接,因为它会降低方法性能。如果它正在重用连接/池,则发布SQL,以便您可以建议重构/改进它 – 2013-03-25 04:19:16

回答

2

确保organization_id,inventory_item_id,尤其是SEGMENT1处于在你的桌子上dexed。

您的查询是非常标准的,如果不工作,那么它看起来像你的数据库服务器响应慢这可能是由于像小空间,低内存,磁盘速度慢的原因号/读取等

然后,您可以要求您的DBA /服务器管理员检查该问题。

2

首先,你需要找出真正的问题

  • 它是数据库查询
  • 是它的网络(是App和位于同一台机器上的数据库?)

一旦你确定它是数据库查询,那么它就变成了更多的数据库问题。

  • 这两张表是怎么样的?
  • 使用的任何索引?
  • 数据是如何看起来像你(有多少行等)

分析之后,你应该能够以不同的方式发布问题和期望的答案。我不是一个DB人,但我相信有人能够提供一些指引。

1

Tunning也要做:

  1. 检查TransactionScope.getConnection();是给没有任何延迟连接。
  2. 而不是创造新的HashMap hashItems = new HashMap();你可以在JSP中使用使用

    while (rs.next()){ 
        myList.add(rs.getString(1) + "delimiter" + rs.getString(2)); 
    } 
    

first = allPOV.get(i).split("delimter")[0]; 
second = allPOV.get(i).split("delimter")[1]; 

,这样就可以减少内存

  1. 如果可能的用途限制在您的查询,并在SEGMENT1link使用索引。