Я пропущу аргумент SQL-инъекции, который слишком хорошо известен, и сосредоточусь только на аспекте параметров SQL, а не на параметрах.
Когда вы отправляете пакет SQL на сервер, любой пакет должен быть проанализирован для понимания. Как и любой другой компилятор, компилятор SQL должен генерировать AST из текста и затем работать с синтаксическим деревом. В конечном итоге оптимизатор преобразует дерево синтаксиса в дерево выполнения и, наконец, создает план выполнения, который фактически запускается. Еще в темные времена около 1995 года было важно, был ли пакет специальным запросом или хранимой процедурой, но сегодня он абсолютно ничего не делает, они все одинаковые.
Теперь, когда параметры имеют значение, клиент отправляет запрос типа select * from table where primary_key = @pk
и каждый раз отправляет точно такой же текст SQL , независимо от того, какое значение его интересует. весь процесс, который я описал выше, закорочен. SQL будет искать в памяти план выполнения для необработанного, неразобранного, текста , который он получил (на основе хэш-дайджеста входных данных), и, если он найден, выполнит этот план. Это означает, что нет разбора, нет оптимизации, ничего, пакет отправляется прямо в исполнение . В OLTP-системах, которые выполняют сотни и тысячи небольших запросов каждую секунду, этот быстрый путь имеет огромное значение для производительности.
Если вы отправите запрос в форме select * from table where primary_key = 1
, то SQL придется хотя бы проанализировать его, чтобы понять, что находится внутри текста, поскольку текст, скорее всего, новый, отличный от любого предыдущего пакета, который он видел (даже один символ, например 1
против 2
, делает весь пакет другим). Затем он будет работать с результирующим синтаксическим деревом и попытаться выполнить процесс под названием Simple Parameterisation . Если запрос может быть автоматически переопаретизирован, то SQL, скорее всего, найдет кэшированный план выполнения для него из других запросов, которые ранее выполнялись с другими значениями pk, и повторно использует этот план, поэтому, по крайней мере, ваш запрос не нужно оптимизировать, и вы пропустите шаг создания фактического плана выполнения. Но ни в коем случае вы не достигли полного короткого замыкания, кратчайшего возможного пути, которого вы достигли с помощью параметризованного запроса истинного клиента.
Вы можете посмотреть SQL Server, объект статистики SQL счетчик производительности вашего сервера. Счетчик Auto-Param Attempts/sec
будет показывать много раз в секунду, что SQL должен преобразовать полученный запрос без параметров в автоматически параметризованный. Любой попытки можно избежать, если вы правильно параметризуете запрос в клиенте. Если у вас также большое число Failed Auto-Params/sec
, что еще хуже, это означает, что запросы проходят полный цикл оптимизации и генерации плана выполнения.