PreparedStatement, CallableStatement против оператора - оператор всегда медленнее - PullRequest
0 голосов
/ 24 сентября 2019

Может ли выполнение PreparedStatement или CallableStatement привести к другой оптимизации запроса, чем если бы точно такой же запрос был просто выполнен как Statement?То есть зависит ли оптимизация запроса от класса, используемого для выполнения оператора?

Будет ли PreparedStatement или CallableStatement всегда быстрее, чем Statement?

Я очень заинтересован в производительности, а не в других преимуществах, таких как портативность.

1 Ответ

1 голос
/ 24 сентября 2019

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

Таким образом, вопросы также можно перефразировать следующим образом: Нужно ли использовать PreparedStatementCallableStatement), чтобыповторно использовать кэшированный план выполнения?

Ответ зависит от вашей системы баз данных.

В некоторых системах, таких как Oracle (с настройками по умолчанию и рекомендуемыми настройками), требуется PreparedStatement для повторного использования плана выполнения,В противном случае он будет выполнять повторный анализ всего запроса (иначе как hard parse ) всякий раз, когда изменяется одно значение в запросе.Еще хуже, поскольку новый запрос и его план будут добавлены в кеш, из кеша нужно будет удалить что-то еще.Таким образом, это может также негативно повлиять на других клиентов базы данных, используя подготовленные операторы.

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

И вам не нужноуслышать, но я все равно скажу: подготовленные операторы - лучший рецепт против атак с использованием SQL-инъекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...