![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разница вызова запроса [D7]
alsov © (2007-08-17 17:05:00)Приветствую, Мастера
Скажите пожалуйста в чем разница вызова запросов с точки зрения производительности Oracle :
qry:=TADOQuery.Create(Self);
qry.sql.add('select name, surname from user where user_id=123);
qry.Open;
И второй вариант вызов через параметр
qry:=TADOQuery.Create(Self);
qry.sql.add('select name, surname from user where user_id=:id);
qry.ParamByName('id').value := 123;
qry.Open;
Заранее благоданет за ответы
Anatoly Podgoretsky (2007-08-20 15:28:00) [21]Точнее он написал, как нехорошо их не использовать, а также почему нельзя писать SELECT *
Игорь Шевченко (2007-08-20 14:06:00) [22]Дядька Кайт аж три книжки написал про то, как хорошо и правильно использовать параметры в запросах...
Desdechado (2007-08-19 17:16:00) [23]Petr V. Abramov © (18.08.07 13:19) [4]
Не на худшее, а на среднее. А механизм "подглядывания" значения в более позних версиях может быть и хуже, т.к. хороший план для "подглянутого" нетипичного значения может быть ужасным для всех последующих типичных.
Petr V. Abramov (2007-08-18 13:19:00) [24]> Desdechado © (17.08.07 17:13) [2]
> Параметрический запрос хорош в этом случае тем, что он подходит для любых значений параметров такого же запроса
подходит-то он подходит, но только по тексту, а кешируется еще и план.
А вот план для другого значения параметра может оказаться совсем неоптимальным.
К тому в версиях до 9-ки даже при первом построении плана оптимизатор НЕ ЗНАЕТ значение параметра и строит план исходя "с расчетом не худшее".
Но это не значит, что я ОТГОВАРИВАЮ использовать параметры, наоборот, использовать их чаще всего ХОРОШО.
alsov (2007-08-17 17:16:00) [25]Спасибо
Все ясно
stanislav (2007-08-17 17:13:00) [26]когда будешь параметр передавать в следующий раз, то весь запрос на сервер уже не пойдет, а только параметр.
Desdechado (2007-08-17 17:13:00) [27]Вот из моей статьи выдержка:
2.1.Использование параметрических запросов
Использование параметров в запросах является правилом хорошего тона в программировании, поскольку имеет множество положительных аспектов:
Улучшается читаемость и облегчается сопровождение кода программ.
При циклических выполнениях запроса с разными значениями параметров есть возможность «подготовить» запрос на сервере один раз, после чего он выполняется быстрее без необходимости «подготовки» на каждой итерации.
Исчезают ошибки, связанные с наличием апострофов, кавычек и неожиданных форматов даты внутри заданных пользователем текстовых строк в конструируемых «на лету» запросах.
Запросы, «подготовленные» сервером, хранятся некоторое время в кэше. Параметрический запрос хорош в этом случае тем, что он подходит для любых значений параметров такого же запроса, тогда как непараметрический – только для точно такого же, включая заданные в его теле (а не в параметрах) значения. Поэтому при совпадении «подготовка» не проводится, что для параметрического запроса это случается гораздо чаще, чем для непараметрического.
Непараметрические запросы тоже попадают в кэш, «выбивая» оттуда давно неиспользованные запросы (любого вида). Однако при большом потоке разнообразных запросов выбиваются и параметрические, которые имели шанс быть использованными далее, и заменяются непараметрическими, которые таких шансов не имеют. Это отрицательно сказывается на производительности сервера, т. к. ему приходится заново подготавливать параметрические запросы, уже «выбитые» из кэша.