Подтвердить что ты не робот

Есть ли недостатки в использовании подготовленных заявлений?

Я читал много о подготовленных заявлениях и во всем, что я читал, никто не говорит о недостатках их использования. Поэтому мне интересно, есть ли какие-нибудь "там драконы", которые люди склонны игнорировать?

4b9b3361

Ответ 1

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

Любой исполняемый оператор готовится рано или поздно (его необходимо разобрать, оптимизировать, скомпилировать и затем выполнить).

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

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

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

Ответ 2

Если вы используете оператор только один раз, или если вы автоматически генерируете динамические операторы sql (и либо должным образом избегаете, либо знаете, что определенные параметры имеют только безопасные символы), тогда вы не должны использовать подготовленные инструкции.

Ответ 3

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

Ответ 4

в некоторых ситуациях механизм базы данных может придумать более низкий план запроса при использовании подготовленного оператора (поскольку он не может делать правильные предположения без фактических значений привязки для поиска).

см., например, раздел "Примечания" в

http://www.postgresql.org/docs/current/static/sql-prepare.html

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

Ответ 5

Единственным недостатком, о котором я могу думать, является то, что они занимают память на сервере. Это не так много, но, вероятно, есть некоторые крайние случаи, когда это было бы проблемой, но мне трудно думать об этом.