Готовый оператор Java медленнее, чем разработчик sql

Я выполняю вызов базы данных Oracle с использованием java и JDBC следующим образом:

PreparedStatement prep=c.prepareStatement(
    "SELECT a.user FROM  data a where a.start_time >=? " +
    "and a.end_time <=? and a.operation='UPDATE USER'");

prep.setString(1, 02-MAR-15);
prep.setString(2, 03-MAR-15);
ResultSet rs=prep.executeQuery();

Этот запрос занимает более 44 секунд, возвращая 560 значений.

Вот тот же запрос в SQL Developer:

SELECT a.user FROM  data a where a.start_time >='02-MAR-15' 
and a.end_time <='03-MAR-15' and a.operation='UPDATE USER';

Это занимает менее 4 секунд.

Я не понимаю, почему второй идет намного быстрее.


person agalli    schedule 05.03.2015    source источник
comment
Можете ли вы опубликовать план объяснения для запроса?   -  person mmmmmpie    schedule 05.03.2015
comment
Какова база данных полей start_time и end_time? Вы обрабатываете их как строки, но это типы DATE, не так ли? Если да, то вам нужно использовать правильные типы данных при привязке параметров.   -  person OldProgrammer    schedule 06.03.2015
comment
проверьте v$sql_plan, когда запрос выполняется. У Oracle также есть что-то вроде среды, которая может влиять на работу exec. план. Это может быть optimizer_goal, чувствительность к регистру, сортировка по национальной кодировке или даже размер буферов ввода-вывода.   -  person ibre5041    schedule 06.03.2015
comment
@OldProgrammer start_time и end_time являются отметками времени. Я пытался использовать отметку времени в качестве типа данных, но не получил никаких улучшений, также попробовал a.start_time ›=to_timestamp(?) и получил те же результаты.   -  person agalli    schedule 06.03.2015


Ответы (2)


Я использовал старый драйвер JDBC, я использовал драйвер для версии 9i, а БД - 11g.

Я обновил драйвер JDBC, и теперь вызов JDBC выполняется так же быстро, как в SQL Developer.

person agalli    schedule 06.03.2015

У меня была та же проблема, и использование setInt вместо setString, где это возможно, помогло.
Выбор занимает 0,07 с в Oracle Developer и 0,7 с по сравнению с 4 с при использовании подготовленного оператора в Java.
Я использовал ojdbc6 11.2.0.4.
Новые версии драйверов (ojdbc8 12.2 или 18.3) устранили эту разницу, но в обоих случаях работают немного медленнее (~1 с).

person user9999    schedule 11.04.2020