Не могли бы вы передать требуемый идентификатор в качестве параметра, а не запросить всю таблицу?
Примерно так:
CREATE FUNCTION dbo.MyTableUDF(@ID int)
RETURNS @myTable TABLE
(
ID int PRIMARY KEY NOT NULL,
FirstName nvarchar(50) NULL,
LastName nvarchar(50) NULL
)
as begin
Insert Into @myTable (ID, FirstName, LastName)
Select ID, FirstName, LastName
From Users
Where ID = @ID
return
end
go
Select * From MyTableUDF(1)
Для этого сценария это был бы гораздо лучший подход.
EDIT:
Хорошо, так как вы используете UDF-таблицу, а не представление, я предполагаю, что это UDF-таблица с несколькими операторами, а не встроенная. Я почти уверен, что использование UDF таким образом не повлияет на производительность.
Производительность действительно снизится, если вы использовали UDF в операторе Select
или предложении Where
. Это потому, что UDF будет вызываться для каждой строки, возвращаемой из таблицы.
например, Select col1, col2, dbo.MyUDF(col3) From MyTable
или
Select col1, col2 from dbo.MyTable Where dbo.MyUDF(col3) != 1
Так что, если вы MyTable
содержали 100 000 строк, ваш UDF будет вызываться 100 000 раз. Если для выполнения UDF требуется 5 секунд, вы столкнетесь с проблемами.
Насколько я понимаю, вы не собираетесь использовать UDF таким образом.