Хотя у меня нет эмпирических доказательств по этому поводу, на которые я могу указать, которые доказывают, что они используются, возможно, стоит указать, что использование подготовленных операторов, использующих сочетание переменных параметров и постоянных значений, позволит оптимизатору запросов к базе данных узнать, какие части запроса будут варьироваться в зависимости от приложения и какие части будут постоянными. Это может быть полезно при планировании запросов. Если вы попадаете в режим цитирования всех ваших данных вместе с запросом, оптимизатор не может угадать, какие части могут быть очень точными, а какие исправлены, без учета истории всех вариантов запроса и анализа различий, чтобы выяснить, какие части меняются.
--we could infer that name will vary and type will not
--but we'd have to analyze all queries sent to work this out
SELECT * FROM person WHERE type = 1 AND name = 'john'
SELECT * FROM person WHERE type = 1 AND name = 'mark'
SELECT * FROM person WHERE type = 1 AND name = 'luke'
--we can easily say that type will vary and name will too
--the previously seen queries would infer differently
SELECT * FROM person WHERE type = @t AND name = @n
Я упоминал, что никогда не читал ничего, что указывает на его использование, но можно прочитать о решениях, которые сервер sql принимает, называемых параметризацией, с помощью которой он кэширует и повторно использует планы на основе первого набора значения, которые он видит загруженными в параметры, которые могут не генерировать оптимальные запросы во всех случаях
Конечно; это может укрепить вашу решимость отказаться от параметров или использовать подсказки, чтобы БД каждый раз перепланировала запрос, но было бы лучше работать с сервером, а не против него, и использовать методы, чтобы планировать его на основе общих или оптимальные возможные значения
Даже если нам не нравятся планы по настройке в соответствии с тем, что мы знаем о переменных и константах, использование подготовленного выражения должно, по крайней мере, позволять БД компилировать и затем повторно использовать это усилие по компиляции, а не переделывать его, уменьшая количество ресурсов, которые должны go подготовить оператор для выполнения.
Подумайте о своем предложении в терминах языка интерфейса:
Чтобы изменить значение действия переменной, вы можете изменить значение времени выполнения с помощью простого присвоения значения в памяти:
sayHello(string name){
console.print("hello " + name);
}
var name = console.readString(),
sayHello(name);
Или вместо этого вы можете создать совершенно новый файл сценария с новым значением, записать его на диск, вызвать компилятор, выйти из работающей версии вашего приложения и запустить вновь скомпилированную версию:
main(){
disk.write("sayHello(string name){console.print(\"hello \"" + name +");}", "c:\\temp\\new.lang");
launchExe("langcompiler.exe", "c:\\temp\\new.lang");
launchExe("c:\\temp\\new.exe");
}
Смешно самостоятельно изменять программу и перекомпилировать только для изменения значения, используемого в вызове функции, верно?
За исключением того, что сервер db делает с каждым непараметризованным SQL, который он получает, если только требуется определенное усилие, чтобы выяснить, является ли только что полученный запрос в основном таким же, как тот, который он получил X минут за go, за исключением некоторой части данных, извлеките эти данные, подключите их к процессу компиляции за 5 минут go ..