JDBC Oracle Query. Медленный при выполнении с setInt () вместо setObject () - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть следующий фрагмент кода:

    public static void main(String[] args) throws SQLException {
    Connection c = getConnection();
    long time = System.currentTimeMillis();
    PreparedStatement ps = c.prepareStatement(sqlQuery);
    int index = 1;
    for (String param: parameters) {
        if (isInt(param)) {
            //ps.setInt(index++, Integer.parseInt(param));
            ps.setObject(index++, Integer.parseInt(param), java.sql.Types.NUMERIC , 0);
        } else {
            ps.setString(index++, param);
        }
    }
    displayResult(ps.executeQuery());
    System.out.println("It took " + (System.currentTimeMillis()-time) + ".");

    time = System.currentTimeMillis();
    Statement s = c.createStatement();
    ResultSet rs = s.executeQuery(expandParametersInStatement(sqlQuery, parameters));
    displayResult(rs);
    System.out.println("It took " + (System.currentTimeMillis()-time) + ".");
}

Запрос, выполняемый с PreparedStatement, медленнее в 4000 раз. По сравнению с подходом Statement.Они дают одинаковый результат, и порядок исполнения не имеет большого значения.

Использование setObject () вместо setInt () делает PreparedStatement так же быстро, как и Statement.

В чем разница?В ролях в базе данных не может быть так дорого?Тип данных в базе данных - это НОМЕР (10).Я полагаю, что это вопрос индюсов, которые используются.Однако я не могу воспроизвести это в SQL Developer с помощью CAST (x AS INTEGER)?

Спасибо.

Заявление:

private static String sqlQuery = "SELECT sum(value) " +
"FROM a monat, " +
"     n jahr, " +
"     kunde kunde " +
"WHERE monat.kunde_nr IN " +
"    (SELECT DISTINCT kunde.kunde_nr " +
"     FROM MASKE_4_KUNDEN kunde " +
"     WHERE kunde.firma_nr = ? " +
"       AND kunde.verkaufsbereich_nr = ? " +
"       AND kunde.vertriebsbereich_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END) " +
"       AND kunde.vertreter_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END)" +
"       AND kunde.konzern_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END) " +
"       AND kunde.geschaeftsjahr = ? " +
"       AND kunde.kunde_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END))" +
"  AND monat.firma_nr = ? " +
"  AND monat.verkaufsbereich_nr = ? " +
"  AND monat.jahr_nr = ? " +
"  AND jahr.kunde_nr = monat.kunde_nr " +
"  AND jahr.firma_nr = monat.firma_nr " +
"  AND jahr.jahr_nr = monat.jahr_nr " +
"  AND jahr.verkaufsbereich_nr = monat.verkaufsbereich_nr " +
"  AND kunde.kunde_nr = monat.kunde_nr " +
"  AND kunde.firma_nr = monat.firma_nr";

Ответы [ 2 ]

0 голосов
/ 09 августа 2013

Мы наблюдали такое же поведение и с подготовленным оператором, имеющим только операторы setString () над базой данных Oracle 10.2.0.4.0.

Проблема полностью решена Обновление драйвера jdbc с 10.2.0.3.0 до 10.2.0.4.0

0 голосов
/ 15 февраля 2012

Метод setInt () получает int как второй параметр (не Integer). теперь я знаю, что автобокс должен работать, но, видимо, он не всегда работает: http://www.coderanch.com/t/550628/JDBC/java/setInt-String-int-Lost Я предполагаю, что он не работал в более старых версиях JDBC и работает в более новых версиях, но все еще глючит ... Я бы попробовал использовать Integer.intValue () и посмотреть, работает ли он лучше!

Если у кого-то есть что-то еще в отношении - я хотел бы услышать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...