Должен ли я использовать prepareStatement в повторяющемся запросе, в котором условие предложения предиката изменяет часто, вызывая изменение выбранного плана

1

У меня есть приложение Java, которое выполняет запросы на сервере PostgreSQL 9.3 с использованием JDBC. В моем приложении java мне приходилось выполнять один и тот же запрос много раз (в тысячах) с разными аргументами в предикатах where, where. До сих пор я использую класс Statement. Недавно я прочитал о классе PreparedStatement, и я думаю, следует использовать его для ускорения обработки. Но я сомневаюсь в этом. Поскольку мой запрос выполняется каждый раз с разными значениями в предикате Where where, избирательность изменится, и, следовательно, выбор, выбранный сервером db, изменится. В этом случае будет использоваться PreparedStatement ускорить обработку? Выбран ли план при создании Preparedstatement или выборе плана только при вызове execute на подготовленном объекте? Если план выбран, когда подготовленное состояние создано самостоятельно, как это делается, поскольку оптимизатор выбирает планы, основанные на избирательности, рассчитанной с использованием фактических значений предиката.

Мой запрос является сложным, включающим множество таблиц. Шаблон похож, выберите что-нибудь из таблиц, где predicate1 и predicate2 и цена <X и дата <Y; где X и Y изменяются для каждого запроса.

Теги:
jdbc

2 ответа

1
Лучший ответ

Из документа PostgreSQL:

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

moe был прав: подготовка запроса будет только устранять накладные расходы на повторное его повторное использование. Планирование выполняется только тогда, когда вы будете выполнять подготовленный запрос с его параметрами.

  • 0
    Хорошо. Но мне интересно, сколько времени экономит парсинг и перезапись, так как я считаю, что планирование - это трудоемкий шаг. Если это происходит каждый раз, когда выполняется подготовленный оператор, то как вы думаете, было бы полезно переключиться на PreparedStatement в моем сценарии.
  • 0
    Это тот самый вопрос, где сравнение обоих решений - единственное ... решение, я думаю :)
Показать ещё 1 комментарий
0

В 9.3 он использует эвристику. Он делает что-то вроде планирования запроса с конкретными значениями привязки в первые 5 раз, когда подготовленный оператор выполняется. Если ни один из этих планов окажется значительно лучше, чем общий план, он останавливает индивидуальное планирование, и с этого момента Justs использует общий план.

Но есть еще одна морщина в том, что только потому, что ваш код сказал водителю использовать подготовленный оператор, это не значит, что драйвер на самом деле это делает. Многие водители делают странные вещи.

Реальный ответ - тест, тест, тест.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню