Краткий ответ:
PreparedStatement помогает повысить производительность, поскольку обычно клиенты БД выполняют один и тот же запрос многократно, и это позволяет выполнить некоторую предварительную обработку для начального запроса , чтобы ускорить следующие повторяющиеся запросы .
Длинный ответ:
Согласно Википедии , типичный рабочий процесс использования подготовленного оператора выглядит следующим образом:
Подготовка : шаблон выписки создается приложением и отправляется
в систему управления базами данных (СУБД). Определенные значения остались
неопределенные, вызываемые параметры, заполнители или переменные связывания
(с пометкой «?» ниже): ВСТАВИТЬ В ПРОДУКТ (название, цена) ЗНАЧЕНИЯ (?,?)
(прекомпиляция) : СУБД анализирует, компилирует и выполняет оптимизацию запросов на
шаблон выписки и сохраняет результат без его выполнения.
Выполнить : позднее приложение предоставляет (или связывает) значения
для параметров, и СУБД выполняет инструкцию (возможно,
возвращая результат). Приложение может выполнить инструкцию как можно больше
раз, как он хочет с разными значениями. В этом примере это может
поставьте «Хлеб» для первого параметра и «1,00» для второго
параметр.
Приготовьте:
В JDBC шаг «Подготовка» выполняется путем вызова java.sql.Connection. prepareStatement (String sql) API. Согласно его Javadoc:
Этот метод оптимизирован для обработки параметрических операторов SQL, которые выигрывают от предварительной компиляции. Если драйвер поддерживает прекомпиляцию, метод prepareStatement отправит инструкцию в базу данных для прекомпиляции. Некоторые драйверы могут не поддерживать прекомпиляцию. В этом случае инструкция не может быть отправлена в базу данных, пока не будет выполнен объект PreparedStatement. Это не имеет прямого влияния на пользователей; однако это влияет на то, какие методы генерируют определенные объекты SQLException.
Поскольку вызов этого API может отправлять оператор SQL в базу данных, обычно это дорогой вызов. В зависимости от реализации драйвера JDBC, если у вас один и тот же шаблон оператора SQL, для повышения производительности вам, возможно, придется избегать многократного вызова этого API на стороне клиента для одного и того же шаблона оператора SQL.
Прекомпиляция:
Отправленный шаблон выписки будет предварительно скомпилирован в базе данных и кэширован на сервере БД. База данных, вероятно, будет использовать шаблон оператора соединения и sql в качестве ключа, а предварительно скомпилированный запрос и вычисленный план запроса в качестве значения в кэше. При синтаксическом анализе запроса может потребоваться проверка таблицы, столбцов для запроса, поэтому это может быть дорогостоящей операцией, а вычисление плана запроса также является дорогостоящей операцией.
Execute:
Для следующих запросов из одного и того же соединения и шаблона оператора sql предварительно скомпилированный запрос и план запроса будут просматриваться непосредственно из кэша сервером базы данных без повторного вычисления.
Вывод:
С точки зрения производительности, использование оператора подготовки - двухэтапный процесс:
- Этап 1, подготовка и предварительная компиляция, ожидается, что этот этап будет
сделать один раз и добавить некоторые накладные расходы на производительность.
- Фаза 2,
повторное выполнение одного и того же запроса, так как фаза 1 имеет некоторые предварительные
обработка запроса, если количество повторяющихся запросов велико
достаточно, это может сэкономить много предварительной обработки для того же
запрос.
И если вы хотите узнать больше деталей, есть несколько статей, объясняющих преимущества PrepareStatement:
- http://javarevisited.blogspot.com/2012/03/why-use-preparedstatement-in-java-jdbc.html
- http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html