Tôi chạy một số thử nghiệm với một chút logic dài, với cùng một bit mã (một phát biểu SELECT dài) chạy trong cả một hàm bảng có giá trị và một thủ tục lưu trữ, và một EXEC/SELECT thẳng, và mỗi thực hiện giống hệt nhau. Theo quan điểm của tôi, luôn sử dụng một hàm Table Valued thay vì một thủ tục lưu sẵn để trả về một tập kết quả, vì nó làm cho logic dễ dàng hơn và dễ đọc hơn trong các truy vấn sau đó tham gia vào chúng và cho phép bạn sử dụng lại cùng một logic. Để tránh quá nhiều của một hit hiệu suất, tôi thường sử dụng "tùy chọn" thông số (ví dụ: bạn có thể vượt qua NULL cho họ) để kích hoạt chức năng trả lại kết quả thiết lập để được nhanh hơn, ví dụ:
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
Bằng cách này bạn có thể sử dụng chức năng này cho nhiều tình huống khác nhau, và không có một hit hiệu suất rất lớn.Tôi tin rằng điều này hiệu quả hơn lọc sau đó:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Tôi đã sử dụng kỹ thuật này trong một số chức năng, đôi khi có danh sách dài các tham số "tùy chọn" của loại này.
Nguồn
2011-07-27 06:16:07
Đây có vẻ là câu trả lời hoàn hảo: http://stackoverflow.com/a/1179778/365188 –