Przeprowadziłem kilka testów z długim biegiem logiki, z tym samym bitem kod (długa instrukcja SELECT) działająca zarówno w funkcji wycenianej w tabeli, jak i w procedurze zapisanej, oraz prostej operacji EXEC/SELECT i każdej przeprowadzonej identycznie.
Moim zdaniem, zawsze używaj funkcji wycenianej z tabeli, a nie procedury przechowywanej, aby zwrócić zestaw wyników, ponieważ sprawia, że logika jest znacznie łatwiejsza i czytelniejsza w zapytaniach, które następnie dołączają do nich, i umożliwia ponowne użycie tej samej logiki. Aby uniknąć zbyt wielkim hitem wydajności, często używam „opcjonalne” parametry (czyli można przekazać NULL do nich), aby włączyć funkcję wrócić zestaw wyników będzie szybsze, 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
ten sposób może korzystać z tej funkcji w wielu różnych sytuacjach i nie należy przyjmować ogromnych wyników.Wierzę, że to jest bardziej wydajny niż filtrowanie potem:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Użyłem tej techniki w kilku funkcjach, czasami z długiej listy „opcjonalne” parametry tego typu.
To wydaje się być doskonałą odpowiedzią: http://stackoverflow.com/a/1179778/365188 –