Преимущества пользовательских функций над хранимыми процедурами - PullRequest
4 голосов
/ 09 февраля 2010

У меня есть некоторые сомнения относительно пользовательских функций. Я хотел бы знать, почему / когда использовать функции.

В чем преимущества функций перед хранимой процедурой?

Исследуя через Google, я видел статьи, предлагающие:

  • хранимая процедура более выгодна, чем функции.
  • функция имеет ограниченную обработку ошибок
  • функции не могут использовать временные таблицы
  • функции не могут вызывать хранимые процедуры.

Единственное преимущество функции - мы можем использовать функцию в качестве встроенных запросов.

Я могу получить тот же результат с хранимой процедурой, используя временные таблицы, но мне нужно знать, какой сценарий использовать функции по сравнению с хранимой процедурой. Мне нужно знать, почему нам нужен UDf, когда большинство функций, предоставляемых UDF, могут быть выполнены с помощью хранимой процедуры. Может ли кто-нибудь направить меня по этому поводу.

Ответы [ 4 ]

2 голосов
/ 09 февраля 2010

Существует три типа функций: Скалярная, Встроенная таблица и Таблица значений. Вообще говоря, функции Scalar & Table Values ​​могут привести к проблемам с производительностью, поскольку оптимизатор запросов не очень хорошо справляется с оптимизацией использования этих типов функций. Однако производительность функции Inline Table просто великолепна.

Здесь есть запрос на подключение для создания скалярной функции нового типа: Функция скалярного выражения ускорит производительность ...

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

2 голосов
/ 09 февраля 2010

Основным «недостатком» пользовательских функций является то, что они вызываются для каждой строки. Итак, если у вас есть такая функция в списке SELECT, и вы работаете с большими наборами, есть хорошие шансы, что ваша производительность пострадает.

2 голосов
/ 09 февраля 2010

Основным отличием (преимуществом) является то, что вы можете вызывать функции inline в отличие от хранимых процедур. например,

SELECT dbo.fxnFormatName(FirstName, LastName) AS FormattedName
FROM MyTable

SELECT * 
FROM dbo.fxnTableReturningFunction() x

Пользовательские функции могут возвращать данные типа TABLE, а затем функцию можно вызывать в запросе, как показано выше. В случае sproc вам нужно будет выполнить его и сохранить результаты во временной таблице, чтобы затем манипулировать / запрашивать набор результатов далее.

С другой стороны, да, вы ограничены в том, что вы можете сделать в функции. например вы не можете использовать динамический SQL и до SQL 2005 вы не можете использовать недетерминированные функции, такие как GETDATE () внутри функции.

Примером, когда вы можете захотеть использовать функции, является завершение общей функциональности «форматирования», как показано в первом примере выше - вместо того, чтобы повторять логику для форматирования имени и фамилии в одно в каждом запросе, вы оберните это в функцию и вызывайте это везде. Обычно я рекомендую оставить форматирование до пользовательского интерфейса, но это простой пример того, где / почему вы можете использовать.

Кроме того, часто может быть приятнее не создавать временные таблицы для хранения результатов из sproc для дальнейшего его запроса. Если sproc изменяется и возвращает больше столбцов, вам также необходимо изменить везде, где результаты загружаются во временную таблицу, чтобы синхронизировать схему таблицы, которую он использует для хранения результатов с новой возвращенной схемой. У вас нет этой проблемы с функциональным подходом, так как нет временной таблицы для обслуживания.

0 голосов
/ 24 ноября 2017

Преимущество хранимой процедуры Mysql

  1. Несколько приложений работают в нескольких средах и должны использовать одну и ту же базу данных. Используя хранимую процедуру, вы можете сделать свою бизнес-логику независимой от языка программирования.

  2. Когда безопасность является главной задачей, использование хранимой процедуры жизненно важно. Выполнив свою операцию через базу данных, вы можете записать все выполненные действия. Банковский сайт - лучший пример.

  3. Если вы используете хранимую процедуру, то у вас нет прямого доступа к таблице, что является еще одним способом защиты данных и транзакции.

  4. Хранимая процедура иногда повышает производительность вашего приложения

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

  6. Поскольку хранимая процедура написана на сервере базы данных, а приложение вызывает ее отдельно, то степень повторного использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...