В общем, самая дорогая часть выполнения SQL-запроса - это создание плана выполнения - определение таблиц, которые будут необходимы, определение наилучших индексов (если таковые имеются) для использования и т. Д. Вы можете думать об этом как " составление "запроса, если хотите.
Когда вы используете параметризованный запрос, вы можете подготовить его один раз, а затем просто включить другие целевые значения. Поскольку это одна и та же операция с разными данными, нет необходимости каждый раз перестраивать план выполнения. Чтобы расширить метафору «компиляции», это похоже на повторное выполнение одной и той же программы с другим файлом конфигурации.
Однако, когда вы добавляете значения, вы жестко их кодируете в запросе, поэтому его приходится каждый раз пересматривать, и вы несете затраты на создание нового плана выполнения для каждой итерации. Опять же, с метафорой «компиляции», это похоже на программу на C со всей ее жестко заданной конфигурацией - измените один параметр, и вам придется перекомпилировать все это.
(Другая большая цена, с которой вы можете столкнуться при массовых вставках, - это обновление индексов. Если ваша таблица проиндексирована, вы можете попытаться отключить их, выполнить вставки и снова включить их, так что для этого нужно только переиндексировать один раз, а не после добавления каждой строки.)