Подготвеният оператор на 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, чувствителност към малки и главни букви, сортиране според националния набор от символи или дори размера на io буферите.   -  person ibre5041    schedule 06.03.2015
comment
@OldProgrammer start_time и end_time са timestamp Опитах се да използвам timestamp като тип данни, но не получих подобрение, опитах също a.start_time ›=to_timestamp(?) и получих същите резултати   -  person agalli    schedule 06.03.2015


Отговори (2)


Използвах стар JDBC драйвер, използвах драйвера за версията 9i и DB е 11g.

Актуализирах JDBC драйвера и сега JDBC извикването работи толкова бързо, колкото в SQL Developer.

person agalli    schedule 06.03.2015

Имах същия проблем и използвах setInt вместо setString, където е възможно, свърши работа.
Select отнема 0,07s в разработчиците на Oracle и 0,7s срещу 4s, използвайки подготвен оператор в Java.
Използвах ojdbc6 11.2.0.4.
По-новите драйвери (ojdbc8 12.2 или 18.3) премахнаха разликата, но също така работят малко по-бавно и в двата случая (~1s).

person user9999    schedule 11.04.2020