Saya menjalankan beberapa tes dengan sedikit logika yang berjalan lama, dengan sedikit kode yang sama (pernyataan SELECT panjang) yang berjalan di Fungsi Table Valued dan Prosedur Tersimpan, dan EXEC / SELECT lurus, dan masing-masing dilakukan secara identik.
Menurut pendapat saya, selalu gunakan Fungsi Nilai Tabel daripada prosedur tersimpan untuk mengembalikan kumpulan hasil, karena ini membuat logika lebih mudah dan dapat dibaca dalam kueri yang kemudian bergabung dengannya, dan memungkinkan Anda untuk menggunakan kembali logika yang sama. Untuk menghindari terlalu banyak hit kinerja, saya sering menggunakan parameter "opsional" (yaitu Anda dapat meneruskan NULL ke mereka) untuk mengaktifkan fungsi untuk mengembalikan hasil yang ditetapkan menjadi lebih cepat, misalnya:
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
Dengan cara ini Anda dapat menggunakan fungsi ini untuk banyak situasi yang berbeda, dan tidak mengalami penurunan kinerja yang besar. Saya yakin ini lebih efisien daripada memfilter sesudahnya:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Saya telah menggunakan teknik ini dalam beberapa fungsi, terkadang dengan daftar panjang parameter "opsional" dari jenis ini.