Какой подход лучше с точки зрения производительности? (что касается использования маркеров переменных параметров в подготовленном операторе в JDBC) - PullRequest
1 голос
/ 02 июня 2009

Моя цель - получить DeptNames некоторых сотрудников из таблицы Emp. Но количество сотрудников меняется. Скажите, пожалуйста, правильный ли приведенный ниже подход и какой из приведенных ниже подходов лучше для производительности? Или есть лучший способ сделать это?

PreparedStatement pstmt = conn.prepareStatement("SELECT Dept from Emp WHERE EmpNum = ? ");
    for (int i = 0, len = empNumberList.size(); i < len; i++) {
      pstmt.setLong (1, empNumberList.get(i));
      ResultSet rs = pstmt.executeQuery();
    }

Или

StringBuffer buffer = new StringBuffer();
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?");
for (int i = 0, len = empNumberList.size(); i < len; i++) {
  buffer.append(",?");
}
buffer.append(")");
PreparedStatement pstmt = con.prepareStatement(buffer.toString());
for(int i = 0; i < len; i++) {
pstmt .setLong(i, empNumberList.get(i));
}
ResultSet rs = pstmt .executeQuery();

Или есть другой лучший способ сделать это? Пожалуйста посоветуй. Заранее спасибо!

Ravilla

Ответы [ 4 ]

2 голосов
/ 02 июня 2009

Вообще говоря, выполнение одного запроса круче выполнения нескольких запросов, потому что в большинстве (тривиальных) запросов стоимость обхода сервера рассматривается как значительная стоимость.

При этом поставщик базы данных, JDBC или драйвер могут ограничивать количество параметров, которые вы можете передать таким образом, поэтому вам следует с этим опасаться.

Как сказал другой автор: нет необходимости фильтровать клиента. Просто используйте DISTINCT в этом случае.

0 голосов
/ 02 июня 2009

Я согласен с оценками, что второй, вероятно, будет быстрее.

Однако, если вы действительно хотите знать: эталон. Результаты производительности часто не интуитивно понятны и различаются в зависимости от платформы, базы данных, архитектуры и версии. Так что попробуйте сами и измерьте разницу.

0 голосов
/ 02 июня 2009

Вероятно, второй вариант, так как обычно запросы к базе данных занимают больше времени.

Кроме того, в вашем коде есть ошибка:

StringBuffer buffer = new StringBuffer();
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?");
for (int i = 1, len = empNumberList.size(); i < len; i++) { // one ? was written
  buffer.append(",?");
}
buffer.append(")");
PreparedStatement pstmt = con.prepareStatement(buffer.toString());
for(int i = 0; i < len; i++) {
pstmt .setLong(i+1, empNumberList.get(i)); // pstmt setXXX() are 1 based
}
ResultSet rs = pstmt .executeQuery();
0 голосов
/ 02 июня 2009

Я бы сказал,

"ВЫБЕРИТЕ DISTINCT Dept ОТ Emp, ГДЕ EmpNum IN (" + query + ")"

тогда выполнение setLong () было бы лучшим подходом и, вероятно, лучшей производительностью, но единственный способ убедиться в производительности - это профилировать ее.

...