Как улучшить производительность запросов на выборку в Java? - PullRequest
0 голосов
/ 22 июня 2011

Я использую базу данных BerkeleyDB и выполняю select запрос, который требует 409 мс. Как улучшить производительность выбора запроса?

Я использую следующий код:

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 ]

6 голосов
/ 22 июня 2011

@ Дхананджай Джоши, мой первый совет: нужно изменить выбор из select * и поставить поля, которые вам действительно нужны, когда вы делаете select *, вы получаете много полей, которые, возможно, вам не нужны и требуютбольше памяти

1 голос
/ 22 июня 2011

Большую часть времени можно потратить на печать результатов.

Попробуйте запустить тест без печати данных.

1 голос
/ 22 июня 2011

Я не думаю, что есть что-то, что можно улучшить в вашем коде с точки зрения доступа к БД. Выбор всех строк является тривиальной задачей для базы данных, которая в основном просто занимает определенное время. использование PreparedStatement даст вам некоторое улучшение, если у вас будут повторяться одинаковые / похожие запросы, но не в тестовом сценарии.

У вас есть небольшие накладные расходы в Java-части, которые связаны с выделением / объединением строковых объектов. Вы можете заменить свое тело цикла на

 System.out.print(rs.getString(1));
 System.out.print(", ");
 System.out.print(rs.getString(2))
 // ...

или StringBuilder ...

1 голос
/ 22 июня 2011

В общих чертах при использовании JDBC производительность может увеличиться на

  • с использованием StoredProcedure - это выполняет некоторую предварительную обработку ядром базы данных
  • с использованием PreparedStatement - может облегчить некоторую предварительную обработку, если вы используете запрос несколько раз.

Вы также можете сократить время, оптимизировав запрос, возможно, добавив соответствующие индексы. Использование explain может помочь вам понять действия и стоимость запроса.

Однако в вашем примере вы просто выполняете простой выбор без предиката, поэтому ни один из них вам не поможет.

0 голосов
/ 23 июня 2011

Вы можете поставить напечатанную метку времени после оператора executeQuery. И пытается выяснить, что тратит больше времени в вашей программе (получить данные из базы данных или инструкции Java).

Теоретически, получение данных из базы данных было бы узким местом, если данные достаточно велики.

...