如何提高Java中的选择查询性能?

时间:2011-06-22 14:23:06

标签: java performance berkeley-db

我正在使用BerkeleyDB数据库,我正在执行需要409毫秒的select查询。如何提高选择查询性能?

我使用以下代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class ReadData {

Connection con=null;
ResultSet rs=null;
Statement smt = null;

public void readData() 
{
     try
     {
         Class.forName("SQLite.JDBCDriver");
         con = DriverManager.getConnection("jdbc:sqlite:/D:\\DB\\Mediation.db");
         smt = con.createStatement();

         long startTime = System.currentTimeMillis();
         rs = smt.executeQuery("select * from CDRData");             
         while(rs.next())
         {
             System.out.println(rs.getString(1)+" , "+rs.getString(2)+" , "+rs.getString(3)+" , "+rs.getString(4)+" , "+rs.getString(5)+" , "+rs.getString(6)+" , "+rs.getString(7)+" , "+rs.getString(8)+" , "+rs.getString(9)+" , "+rs.getString(10)+" , "+rs.getString(11)+" , "+rs.getString(12)+" , "+rs.getString(13)+" , "+rs.getString(14)+" , "+rs.getString(15)+" , "+rs.getString(16)+" , "+rs.getString(17)+" , "+rs.getString(18)+" , "+rs.getString(19)+" , "+rs.getString(20)+" , "+rs.getString(21)+" , "+rs.getString(22)+" , "+rs.getString(23));
         }
         long finishTime = System.currentTimeMillis();
         System.out.println("The time taken by select query : "+(finishTime-startTime)+ " ms");
     }
     catch(Exception e)
     {
         System.out.println("Error ---- "+e);
     }
}

public static void main(String[] args) {
    ReadData csvread = new ReadData();
    csvread.readData();
}
}

5 个答案:

答案 0 :(得分:6)

@Dhananjay Joshi我的第一个推荐是需要更改select *中的选择并将你真正需要的字段放在select *你带来很多字段,也许你不喜欢需要并需要更多内存

答案 1 :(得分:1)

一般而言,使用JDBC时,您可能会看到性能提升

  • 使用StoredProcedure - 这可以通过数据库引擎进行一些预处理
  • 使用PreparedStatement - 如果您多次使用查询, 可以一些预处理。

您还可以通过优化查询来改善时间,也许可以通过添加适当的索引来实现。使用explain可以帮助您了解查询将会遇到的操作和成本。

但是,在您的示例中,您只是执行一个没有谓词的简单选择,因此这些都不会对您有所帮助。

答案 2 :(得分:1)

我认为在数据库访问方面,您的代码无法改进。选择所有行对于数据库来说是一项微不足道的任务,基本上只需要一定的时间。如果您反复使用相同/类似的查询,但使用PreparedStatement会给您一些改进,但不会在您的测试场景中。

你的java部分有一点开销虽然来自分配/连接字符串对象。您可以通过

替换循环体
 System.out.print(rs.getString(1));
 System.out.print(", ");
 System.out.print(rs.getString(2))
 // ...

或StringBuilder ......

答案 3 :(得分:1)

大部分时间都可用于打印结果。

尝试运行测试而不打印数据。

答案 4 :(得分:0)

您可以在“executeQuery”语句后面加上打印的时间戳。并试图弄清楚你的程序花费的时间是多少(从数据库或java指令中检索数据)。

理论上,如果数据足够大,从数据库中检索数据将成为瓶颈。