Чем процедуры лучше, чем вызрв из программы.
emilg
Дата: 14.02.2005 20:40:32
Уважаемые, опыта у меня мало, наверное поэтому и возник этот вопрос.
Чем лучше или хуже использовать процедуры сидящие внутри БД, по сравнению с вызовом SQL комманд прямо из программы. Что показывает опыт и практика, а также научные рекомендации на эту темую или подскажите где об этом можно почитать?
1-ый ответ я придумал сам, при вызове из программы, я могу динамический построить текст SQL и это преимущество по сравнению с константной процедурой, не так ли?
Спасибо за помощь.
Easygoing
Дата: 14.02.2005 21:26:58
emilg |
Уважаемые, опыта у меня мало, наверное поэтому и возник этот вопрос.
Чем лучше или хуже использовать процедуры сидящие внутри БД, по сравнению с вызовом SQL комманд прямо из программы. Что показывает опыт и практика, а также научные рекомендации на эту темую или подскажите где об этом можно почитать?
1-ый ответ я придумал сам, при вызове из программы, я могу динамический построить текст SQL и это преимущество по сравнению с константной процедурой, не так ли?
Спасибо за помощь. |
Нет не так.
Преимущества хп:
-безопасность
-экономия трафика
-OUTPUT параметры
-сложная логика
-etc
vava
Дата: 14.02.2005 23:11:15
Весь код запроса можно скрыть в процедуре,в неё передовать только параметры, а обратно ref cursor.
В результате потом можно будет менять запрос без изменения клиента.
Инкапсуляция в общем.
Алексей2003
Дата: 15.02.2005 08:50:55
безопасность.
немножко сложнее взломать запрос к серверу, правда если в процедуре не используется динамический запрос. все что видно, так только название процедуры.
tru55
Дата: 15.02.2005 10:54:31
Свои две копейки (правда, говорю на примере Oracle, возможны вариации в зависимости от БД).
1. Выше скорость. Любой SQL, посланный на сервер, повергается разбору (parsing) и компиляции. Процедура уже хранится в скомпиленном виде, соответственно, на этом экономим время.
2. Безопасность. По умолчанию, процедура выполняется с правами владельца. Т.е. если посылаю просто SQL, у меня должны быть права на работу с этими объектами (SELECT, INSERT и т.д.). Следовательно, если у вызывающего есть права на UPDATE таблицы, то он может это делать и помимо приложения (в Oracle - например, SQL*Plus - изменить ЛЮБЫЕ данные в таблице). Если работа идет через процедуру, то выдается только GRANT на EXECUTE этой процедуры, т.е. изменять можно только то, что позволит процедура
andsm
Дата: 15.02.2005 18:53:49
tru55 |
1. Выше скорость. Любой SQL, посланный на сервер, повергается разбору (parsing) и компиляции. Процедура уже хранится в скомпиленном виде, соответственно, на этом экономим время. |
Для MS SQL2k это не совсем верно. Вначале время на компиляцию тратится, но после некоторого количества вызовов одного и того же запроса включается автопараметризация, и разница по скорости из-за компиляции исчезает. Кроме того, в MS SQL процедура при первом вызове тоже подвергается компиляции - хранится не в откомпилированном виде.
Пункт 2 - верен для работы с таблицами. Если например владелец ХП имеет права sysadmin-a, и в ХП имеется что-то вроде вызова xp_cmdshell, то если вызывающий пользователь не входит в группу сисадминов, ХП не сработает.
Sa
Дата: 15.02.2005 22:05:45
Вообще то тема полуофф.
Использование хранимых процедур предпочтительнее, но это несет в себе некоторые ограничения (не функциональные).
А так, запустите SQL Profiler и посмотрите каким образом выполняется ваш динамически построенный запрос, далее BOL и главный форум.
uid = Sa
Shultze
Дата: 16.02.2005 09:42:40
Как показывают многочисленные обсуждения на этом форуме по этому вопросу все сходятся на том, что если в проекте есть DBA который грамотно может оформить слой данных на T-SQL или PL/SQL то процедуры предпочтительнее. Если нет, то лучше не заморачиваться.
tru55
Дата: 16.02.2005 10:34:53
Shultze |
Как показывают многочисленные обсуждения на этом форуме по этому вопросу все сходятся на том, что если в проекте есть DBA который грамотно может оформить слой данных на T-SQL или PL/SQL то процедуры предпочтительнее. Если нет, то лучше не заморачиваться. |
Некоторое уточнение.
Как правило, процедуры все таки пишет не DBA (не его это дело), а разработчик. Другое дело, что в одних случаях и клиентскую, и серверную часть пишет один человек, а в других - разные
PS. Хотя согласен - тема не совсем для ADO