производительность параметризованных запросов для разных БД

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

Параметризованные запросы также намного быстрее выполняются в sqlite и oracle при онлайн-обработке транзакций, поскольку оптимизатору запросов не нужно повторно анализировать каждую параметризованную инструкцию sql перед выполнением. Я видел, как sqlite становится в 3 раза быстрее, когда вы используете параметризованные запросы, oracle может работать в 10 раз быстрее, когда вы используете параметризованные запросы в некоторых экстремальных случаях с большим параллелизмом.

Как насчет других баз данных, таких как mysql, ms sql, db2 и postgresql?

Есть ли одинаковая разница в производительности между параметризованными запросами и литеральными запросами?


person tuinstoel    schedule 23.08.2009    source источник


Ответы (2)


Что касается MySQL, MySQLPerformanceBlog сообщил о некоторых контрольных показателях запросов в секунду с неподготовленными операторами, подготовленными операторами и кэшированными запросами. Их вывод состоит в том, что подготовленные операторы на самом деле на 14,5% быстрее, чем неподготовленные операторы в MySQL. Перейдите по ссылке, чтобы узнать подробности.

Конечно, соотношение варьируется в зависимости от запроса.

Некоторые люди полагают, что есть некоторые накладные расходы, потому что вы делаете дополнительный круговой путь от клиента к СУБД — один для подготовки запроса, второй для передачи параметров и выполнения запроса.

Но реальность такова, что это ложные предположения, сделанные без фактического измерения. Я никогда не слышал, чтобы подготовленные операторы работали медленнее в какой-либо базе данных.

person Bill Karwin    schedule 28.04.2010
comment
Сегодня потребность в дополнительном круговом обходе для подготовки параметризованных запросов практически устранена, поскольку многие СУБД поддерживают параметризованные запросы, определяемые равенством строк SQL. - person Erik Hart; 05.12.2013
comment
(продолжение комментария): например, с sp_executesql на SQL Server или немедленное выполнение на Oracle. Методы подготовки, все еще доступные во многих языках, которые извлекают идентификатор запроса из БД, могут использоваться только в контексте соединения и подвержены ошибкам программирования (например, вызов подготовки перед каждым запросом). Запросы, идентифицируемые строкой SQL, можно повторно использовать во всем или даже в нескольких приложениях. - person Erik Hart; 05.12.2013

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

person Preet Sangha    schedule 23.08.2009