Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];

Вниз

Разница вызова запроса   Найти похожие ветки 

 
alsov ©   (2007-08-17 17:05) [0]

Приветствую, Мастера

Скажите пожалуйста в чем разница вызова запросов с точки зрения производительности 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;


Заранее благоданет за ответы


 
stanislav ©   (2007-08-17 17:13) [1]

когда будешь параметр передавать в следующий раз, то весь запрос на сервер уже не пойдет, а только параметр.


 
Desdechado ©   (2007-08-17 17:13) [2]

Вот из моей статьи выдержка:
2.1.Использование параметрических запросов
Использование параметров в запросах является правилом хорошего тона в программировании, поскольку имеет множество положительных аспектов:
Улучшается читаемость и облегчается сопровождение кода программ.
При циклических выполнениях запроса с разными значениями параметров есть возможность «подготовить» запрос на сервере один раз, после чего он выполняется быстрее без необходимости «подготовки» на каждой итерации.
Исчезают ошибки, связанные с наличием апострофов, кавычек и неожиданных форматов даты внутри заданных пользователем текстовых строк в конструируемых «на лету» запросах.
Запросы, «подготовленные» сервером, хранятся некоторое время в кэше. Параметрический запрос хорош в этом случае тем, что он подходит для любых значений параметров такого же запроса, тогда как непараметрический – только для точно такого же, включая заданные в его теле (а не в параметрах) значения. Поэтому при совпадении «подготовка» не проводится, что для параметрического запроса это случается гораздо чаще, чем для непараметрического.
Непараметрические запросы тоже попадают в кэш, «выбивая» оттуда давно неиспользованные запросы (любого вида). Однако при большом потоке разнообразных запросов выбиваются и параметрические, которые имели шанс быть использованными далее, и заменяются непараметрическими, которые таких шансов не имеют. Это отрицательно сказывается на производительности сервера, т. к. ему приходится заново подготавливать параметрические запросы, уже «выбитые» из кэша.


 
alsov ©   (2007-08-17 17:16) [3]

Спасибо

Все ясно


 
Petr V. Abramov ©   (2007-08-18 13:19) [4]

> Desdechado ©   (17.08.07 17:13) [2]
> Параметрический запрос хорош в этом случае тем, что он подходит для любых значений параметров такого же запроса
подходит-то он подходит, но только по тексту, а кешируется еще и план.
А вот план для другого значения параметра может оказаться совсем неоптимальным.
К тому в версиях до 9-ки даже при первом построении плана оптимизатор НЕ ЗНАЕТ значение параметра и строит план исходя "с расчетом не худшее".

Но это не значит, что я ОТГОВАРИВАЮ использовать параметры, наоборот, использовать их чаще всего ХОРОШО.


 
Desdechado ©   (2007-08-19 17:16) [5]

Petr V. Abramov ©   (18.08.07 13:19) [4]
Не на худшее, а на среднее. А механизм "подглядывания" значения в более позних версиях может быть и хуже, т.к. хороший план для "подглянутого" нетипичного значения может быть ужасным для всех последующих типичных.


 
Игорь Шевченко ©   (2007-08-20 14:06) [6]

Дядька Кайт аж три книжки написал про то, как хорошо и правильно использовать параметры в запросах...


 
Anatoly Podgoretsky ©   (2007-08-20 15:28) [7]

Точнее он написал, как нехорошо их не использовать, а также почему нельзя писать SELECT *


 
KSergey ©   (2007-08-20 16:44) [8]

> Игорь Шевченко ©   (20.08.07 14:06) [6]
> Дядька Кайт аж три книжки написал про то, как хорошо и правильно
> использовать параметры в запросах...

Графоман, что с него взять.


 
Petr V. Abramov ©   (2007-08-24 23:15) [9]

> Дядька Кайт аж три книжки написал про то, как хорошо и правильно
а он написал, КОГДА хорошо и КОГДА правильно?
то, что дядька умный - сомнений нет, но все писатели с бодуна иногда бывают

> Desdechado ©   (19.08.07 17:16) [5]
> Не на худшее, а на среднее.
между NL и hash выбор в пользу hash, так что считай, что на худшее


 
Petr V. Abramov ©   (2007-08-24 23:17) [10]

ессно, использование параметров в 95% случаев - best practice, но я-то хочу донести, что если вдруг непарметризованный запрос окажется хуже, надо не глаза лупить, а спокойно разбираться


 
Anatoly Podgoretsky ©   (2007-08-25 12:49) [11]

Не 95% а 100%, ну может за исключением тех серверов, где отсутствует план исполнения и компиляция запросов.


 
sniknik ©   (2007-08-25 13:44) [12]

Anatoly Podgoretsky ©   (25.08.07 12:49) [11]
осторожнее... обсуждается оракл а не mssql, а какие у него "завихи" это тем кто с ним работает лучше знать.

то что они есть уверен (хватило личного опыта кратких с ним знакомств).
;)


 
Anatoly Podgoretsky ©   (2007-08-25 14:10) [13]

> sniknik  (25.08.2007 13:44:12)  [12]

Я думаю, что тоже самое - компиляция запросов и помещение их в кеш.
Отсюда все вытекающие - выталкивание из кеша ранее откомпилированых запросов и постноянна компиляция новых, не параметризированых и новое постороение плана.


 
Petr V. Abramov ©   (2007-08-25 18:31) [14]

> Anatoly Podgoretsky ©   (25.08.07 14:10) [13]
оно конечно так, только иногда лучше перекомпилировать. Если этим не увлекаться


 
Anatoly Podgoretsky ©   (2007-08-25 18:46) [15]

Падает производительность сервера.
А не увлекаться не получится, каждый запрос обязан быть перекомпилирован, если это не сделать ранее

select fld where fld=1
select fld where fld=2

Это два разных запроса, две компиляции, два построения плана

select fld where fld=:p
а это один какой бы р не был, ноль компиляций, кроме первого вызова и однократное построение плана в общем случае.

Запросов подобных первому типу будет много и они вытолкнут из кеша запросы второго типа, особено если они будут в более худшей форме, что не редкость, а именно такие
select * where fld=значение
Вот такие запросы почти всегда будут компилироваться, из-за звездочки
или по крайней мере сначала будут разворачиваться до
select fld1, fld2,... where fld=значение
Что займет еще больше времени, чем просто компиляция.

Если запросы первого типа делают из-за низкой квалификации, то запросы третьего типа делают уже из-за лени или лень + низкая квалификация


 
Petr V. Abramov ©   (2007-08-25 20:11) [16]

> Anatoly Podgoretsky ©   (25.08.07 18:46) [15]
select f1, ... fn
from table1, ... bigtaBLE bt
where /* много всего */ and bt.somedate between :date1 and :date2
если этот отчет выполняется раз в день, то пусть лучше компилится,
чем на среднефиговом плане выполняется

> select fld where fld=1
> select fld where fld=2
ну это классика :)
еще скажи по fld первичный ключ :)


 
Anatoly Podgoretsky ©   (2007-08-25 21:42) [17]

> Petr V. Abramov  (25.08.2007 20:11:16)  [16]

Тут уже зависит от базы.
У меня статистика пересчитывается один раз в сутки, автоматический пересчет запрещен.


 
Petr V. Abramov ©   (2007-08-25 22:03) [18]

> Anatoly Podgoretsky ©   (25.08.07 21:42) [17]
тут дело не в статистике (она за день работы сильно не съедет, если ничего глобально не загружать/не читить)
дело в том, что сегодня запрос за день попросят, а завтра за год.


 
Anatoly Podgoretsky ©   (2007-08-25 22:16) [19]

Я вижу влияние статистики, по времени выполнения запросов, время выполнения на следующий день уменьшается раза в два. Есть у моих экономистов дурные запросы.
Если в первый день/дни время было 20 минут, то теперь оно уменьшилось до 10 минут. Прогресс налицо. Между запросами прошли сутки. Есть другое объяснение?
В следующий раз буду проверять в начале следующего месяца и посмотрю, что изменится - месяц это интервал выполнения запросов. Данный запрос выполняется несколько раз в день с одинаковыми данными. Предопределенный запрос. Таких запросов около 6 штук, мой конфигуратор поработает над алгоритмами, может сможет ускорить в несколько раз.


 
Petr V. Abramov ©   (2007-08-25 22:28) [20]

> на следующий день уменьшается раза в два.
а каково относительное изменение размера таблицы за день? или ее размер непредсказуем, массированные инсерты и делиты постоянно?


 
Anatoly Podgoretsky ©   (2007-08-25 22:35) [21]

> Petr V. Abramov  (25.08.2007 22:28:20)  [20]

Размер стабильный, добавлений мало, но это не одна таблица а много и условий сотни.
Я профайлером поймал запрос, так устал ждать когда он прокрутится, а результатом одна страница отчета. Чистая аналитика.
Кроме того я первый раз выполнял в конце дня, а следующий раз рано утром, можно считать, что база не изменялась. Эксперимент был чистый, выполнялся только этот запрос, другой работы в это время не было.
В начале следующего месяца проверю, к этому времени в кеше запроса уже не будет.


 
Petr V. Abramov ©   (2007-08-25 22:36) [22]

ну 10 мин на разбор - это круто :)


 
Anatoly Podgoretsky ©   (2007-08-25 22:38) [23]

10 минут не на разбор, на разбор несколько секунд, это время работы запроса. Сервер у меня достаточно мощный.
Нагрузка на процессоры 25% - 4 процессора XEON - можно сказать что запрос плохо распаралеривается. всего на 25% нагрузки на каждый процессор.


 
Petr V. Abramov ©   (2007-08-25 22:49) [24]

> Anatoly Podgoretsky ©   (25.08.07 22:38) [23]
ну может после сбора какая-то статистика перешагнула некий порог, и оптимайзер перешел к нормальному плану (соломинка, которая переломила хребет верблюду :)
всяко бывает


 
Anatoly Podgoretsky ©   (2007-08-26 12:57) [25]

Так и говорю, что отрабатывает.
Вот бы использование процессоров поднять до 100%, но это утопия.


 
Petr V. Abramov ©   (2007-08-26 16:57) [26]

> Anatoly Podgoretsky ©   (26.08.07 12:57) [25]
так диск, ИМХО, не успевает. смотри wait`ы (если в SQL оно возможно)


 
Anatoly Podgoretsky ©   (2007-08-26 17:38) [27]

К диску вообще нет обращения, вся база в памяти, отдельные микросервесные обращения, типа записи об зеркалировании базы.
Диск и сеть простаивают.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
2-1196676131
Dracula
2007-12-03 13:02
2007.12.30
CallBack из DLL


15-1196177178
All More system
2007-11-27 18:26
2007.12.30
Поисковик или форум?


2-1196847194
Dilmo
2007-12-05 12:33
2007.12.30
Программно открыть заданную папку


2-1197011951
Александр Семак
2007-12-07 10:19
2007.12.30
Удаление установленных компонентов


2-1196943214
DelphiN!
2007-12-06 15:13
2007.12.30
SQL по выбору одновременной работы с приложениями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский