Я провів кілька тестів із тривалим бітом логіки, з однаковим бітом коду (довгий оператор SELECT), що виконується як у функції, що оцінюється таблицею, так і в збереженій процедурі, і в прямому EXEC / SELECT, і кожен виконується однаково.
На мою думку, для повернення набору результатів завжди використовуйте функцію, що оцінює таблицю, а не збережену процедуру, оскільки це робить логіку набагато простішою та читабельнішою у запитах, які згодом приєднуються до них, і дає змогу повторно використовувати ту саму логіку. Щоб уникнути занадто великого удару продуктивності, я часто використовую "необов'язкові" параметри (тобто ви можете передати їм NULL), щоб функція могла швидше повертати набір результатів, наприклад:
CREATE FUNCTION dbo.getSitePermissions(@RegionID int, @optPersonID int, optSiteID int)
AS
RETURN
SELECT DISTINCT SiteID, PersonID
FROM dbo.SiteViewPermissions
WHERE (@optPersonID IS NULL OR @optPersonID = PersonID)
AND (@optSiteID IS NULL OR @optSiteID = SiteID)
AND @RegionID = RegionID
Таким чином, ви можете використовувати цю функцію для багатьох різних ситуацій, і не робіть величезних показників продуктивності. Я вважаю, що це ефективніше, ніж фільтрування після:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Я використовував цей прийом у кількох функціях, іноді з довгим списком "необов'язкових" параметрів цього типу.