Przeprowadziłem kilka testów z długo działającym bitem logiki, z tym samym bitem kodu (długa instrukcja SELECT) działającym zarówno w funkcji wartościowanej w tabeli, jak iw procedurze składowanej oraz prostym EXEC / SELECT, a każdy z nich był identyczny.
Moim zdaniem zawsze używaj funkcji wycenianej w tabeli, a nie procedury składowanej, aby zwrócić zestaw wyników, ponieważ sprawia, że logika jest znacznie łatwiejsza i czytelna w zapytaniach, które następnie łączą się z nimi, i umożliwia ponowne użycie tej samej logiki. Aby uniknąć zbyt dużego spadku wydajności, często używam parametrów „opcjonalnych” (tj. Możesz przekazać im NULL), aby umożliwić funkcji zwracanie zestawu wyników w celu szybszego, np .:
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
W ten sposób możesz używać tej funkcji w wielu różnych sytuacjach i nie odnieść wielkiego sukcesu. Uważam, że jest to bardziej wydajne niż późniejsze filtrowanie:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Używałem tej techniki w kilku funkcjach, czasami z długą listą „opcjonalnych” parametrów tego typu.