У меня есть приложение Java, которое выполняет запросы на сервере PostgreSQL 9.3 с использованием JDBC. В моем приложении java мне приходилось выполнять один и тот же запрос много раз (в тысячах) с разными аргументами в предикатах where, where. До сих пор я использую класс Statement. Недавно я прочитал о классе PreparedStatement, и я думаю, следует использовать его для ускорения обработки. Но я сомневаюсь в этом. Поскольку мой запрос выполняется каждый раз с разными значениями в предикате Where where, избирательность изменится, и, следовательно, выбор, выбранный сервером db, изменится. В этом случае будет использоваться PreparedStatement ускорить обработку? Выбран ли план при создании Preparedstatement или выборе плана только при вызове execute на подготовленном объекте? Если план выбран, когда подготовленное состояние создано самостоятельно, как это делается, поскольку оптимизатор выбирает планы, основанные на избирательности, рассчитанной с использованием фактических значений предиката.
Мой запрос является сложным, включающим множество таблиц. Шаблон похож, выберите что-нибудь из таблиц, где predicate1 и predicate2 и цена <X и дата <Y; где X и Y изменяются для каждого запроса.
PREPARE создает подготовленный оператор. Подготовленный оператор представляет собой серверный объект, который можно использовать для оптимизации производительности. Когда выполняется оператор PREPARE, указанный оператор анализируется, анализируется и переписывается. Когда впоследствии выдается команда EXECUTE, готовый отчет планируется и выполняется. Это разделение труда позволяет избежать повторного анализа анализа анализа, позволяя при выполнении плана выполнения зависеть от заданных значений параметров.
moe был прав: подготовка запроса будет только устранять накладные расходы на повторное его повторное использование. Планирование выполняется только тогда, когда вы будете выполнять подготовленный запрос с его параметрами.
В 9.3 он использует эвристику. Он делает что-то вроде планирования запроса с конкретными значениями привязки в первые 5 раз, когда подготовленный оператор выполняется. Если ни один из этих планов окажется значительно лучше, чем общий план, он останавливает индивидуальное планирование, и с этого момента Justs использует общий план.
Но есть еще одна морщина в том, что только потому, что ваш код сказал водителю использовать подготовленный оператор, это не значит, что драйвер на самом деле это делает. Многие водители делают странные вещи.
Реальный ответ - тест, тест, тест.