2010-08-28 5 views
6

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

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

  1. Подготовка ОТЧЕТНОСТЬ
  2. Получить список из где-то
  3. итерацию по списку
  4. получить подготовленные заявления и сделать некоторые дб обработку запросов и закрыть новые ресурсы, такие как наборы результатов.
  5. заполнить карту с использованием результата и значения из исходного списка

Спасибо.

+4

Подготовленные операторы обычно * быстрее *, чем обычные запросы, если вы повторно используете один и тот же запрос. – Amber

+3

Производительность хорошая, но реальная победа с PreparedStatements - это привязка параметров, которую можно выполнить с помощью API, а не для конкатенации строк. Это особенно полезно для типов дат. Также предотвращает атаки SQL-инъекций. –

+0

@amber, есть накладные расходы на подготовку, которые могут занять некоторое время, чтобы выкупить их до того, как подготовленные заявления будут быстрее во время стены. –

ответ

8

Подготовленные утверждения являются ФАЗАЛЬНЫМИ, а затем незапланированными операторами, если вы повторно используете один и тот же оператор с несколькими наборами данных. Я не знаю ситуации, когда это неверно.

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

Так простой ответ:

Нет, они этого не делают.

+2

Фактически, если вы выполняете инструкцию только один или два раза, время настройки подготовленного оператора может перевесить коэффициент усиления во время выполнения :) – extraneon

+0

Я имел в виду в его ситуации в целом. Его предложенный сценарий «повторялся через список». Я был неясен в своем ответе. Отредактировано мое оригинальное сообщение для ясности. – Erik

4

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

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

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

4

Только что-то появившееся: убедитесь, что вы не создали подготовленные заявления в своих циклах. Есть некоторые накладные расходы, но окупается для себя после третьего запроса или около того. Фактически с большим списком параметров он может быть даже быстрее для одного запроса.

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

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

1

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

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

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

+0

Это именно то, что я делал. – mwangi

+0

Мое мнение заключалось в том, что вы могли проходить через список с шагом в 10 или около того элементов для вызова базы данных. –

Смежные вопросы