Подготовленные операторы заметно замедляют работу программы?

Я пишу программное обеспечение, которое требует от меня подготовки операторов и установки значений, выполнения запроса и получения результатов в цикле. Этот цикл может иметь более 7000 циклов. Если я использую простые операторы, а не подготовленные операторы, сильно ли изменится скорость выполнения?

Вот псевдокод

  1. Подготовить заявления
  2. Получить список откуда-то
  3. Итерация по списку
  4. получить подготовленные операторы и выполнить некоторые запросы к базе данных и закрыть новые ресурсы, такие как наборы результатов.
  5. заполнить карту, используя результат и значения из исходного списка

Спасибо.


person mwangi    schedule 28.08.2010    source источник
comment
Подготовленные операторы обычно быстрее, чем обычные запросы, если вы повторно запускаете один и тот же запрос.   -  person Amber    schedule 28.08.2010
comment
Производительность хорошая, но реальная победа с PreparedStatements заключается в том, что привязка параметров может выполняться через API, а не путем конкатенации строк. Это особенно полезно для типов даты. Также предотвращает атаки SQL-инъекций.   -  person Mike Q    schedule 28.08.2010
comment
@amber, есть накладные расходы на подготовку, которые могут занять некоторое время, чтобы выкупить, прежде чем подготовленные заявления будут быстрее в стенном времени.   -  person Thorbjørn Ravn Andersen    schedule 28.08.2010
comment
@ Thorbjørn, не могли бы вы объяснить немного больше. Я полагал, что время подготовки для Statement и PreparedStatement будет одинаковым.   -  person Amit    schedule 28.08.2010
comment
Почему вы в это верите?   -  person user207421    schedule 28.08.2010
comment
Для базы данных просто требуется больше работы для подготовки подготовленного оператора (заполнители, внутренние структуры данных, которые необходимо сохранить и т. д.), чем для простого оператора. Некоторые базы данных выполняют МНОГО работы, поэтому время, затраченное на оптимизацию, может занять больше времени. Однако просто потому, что подготовленные операторы xkcd.com/327 полезны.   -  person Thorbjørn Ravn Andersen    schedule 28.08.2010
comment
@ Торбьорн Равн Андерсен. Во-первых, Hahaa для (xkcd.com/327). Ты прав. Подготовленный оператор означает дополнительную работу для сервера базы данных. Сервер базы данных уже слишком занят другими транзакциями, поэтому я могу прибегнуть к использованию простых операторов. Спасибо   -  person mwangi    schedule 17.09.2010
comment
Я считаю, что ваш вывод неверен.   -  person Thorbjørn Ravn Andersen    schedule 17.09.2010
comment
Возможно, что подготовленный оператор будет выполняться медленнее, чем специальные запросы. Причина проста: механизм базы данных может сгенерировать план, оптимальный для @x = 1, но не столь оптимальный для @x = 2, 3, 4 и так далее. Однако, вообще говоря, подготовленные операторы внутри узких циклов дадут вам лучшие результаты.   -  person Salman A    schedule 15.09.2017


Ответы (4)


Подготовленные операторы БЫСТРЕЕ, чем неподготовленные операторы, если вы неоднократно используете один и тот же оператор с несколькими наборами данных. Я не знаю ситуации, когда это не так.

После того, как вы подготовили оператор, он отправляется на сервер БД, который затем должен принимать данные каждый раз, когда вы его вызываете - ему не нужно повторно обрабатывать оператор каждый раз, когда вы связываете новые данные.

Итак, простой ответ:

Нет.

person Erik    schedule 28.08.2010
comment
На самом деле, если вы выполняете оператор только один или два раза, время установки подготовленного оператора может перевесить выигрыш во время выполнения:) - person extraneon; 28.08.2010
comment
Я имел в виду в его ситуации вообще. Предложенный им сценарий повторял список. Я был неясен в своем ответе. Отредактировал мой оригинальный пост для ясности. - person Erik; 28.08.2010

Подготовленный оператор быстрее для повторяющихся задач.

http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html :

Если вы хотите выполнить объект Statement много раз, обычно вместо этого используется объект PreparedStatement, который сокращает время выполнения.

person Colin Hebert    schedule 28.08.2010

Вот некоторые вещи, которые всплыли: убедитесь, что вы не создаете подготовленные операторы в своих циклах. Есть некоторые накладные расходы, но они окупаются после третьего запроса или около того. На самом деле с большим списком параметров это может быть даже быстрее для одного запроса.

Что-то, что значительно ускоряет работу, — это выполнение всех ваших запросов в одной (или паре больших) транзакций. Если это большие наборы данных, вы можете сделать 1000 запросов на транзакцию или что-то подобное. (Конечно, семантика вашей предметной области должна это допускать, но по моему опыту это почти всегда так).

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

person Peter Tillemans    schedule 28.08.2010

Вы также можете рассмотреть возможность получения нескольких значений для одного оператора:

SELECT id, value FROM table WHERE id IN (?, ?, ?, ?, ?, ?)

Это будет быстрее, чем отдельные запросы.

person Joshua Martell    schedule 28.08.2010
comment
Это именно то, что я делал. - person mwangi; 17.09.2010
comment
Я имел в виду, что вы можете перебирать список с шагом в 10 или около того элементов за вызов базы данных. - person Joshua Martell; 18.09.2010