如果我有一个UDF返回一个包含数千行的表,但我只想要该行集中的特定行,那么SQL Server是否能够有效地处理这个行?
DECLARE @pID int; --...
SELECT * FROM dbo.MyTableUDF(@pID)
WHERE SomeColumn BETWEEN 1 AND 2 OR SomeOtherColumn LIKE 'this_pattern&'
查询优化器在多大程度上能够推断出这种类型的查询?
如果没有参数,表值UDF与traidtional视图有何不同?
我应该知道的任何问题?
答案 0 :(得分:1)
你不会传递你需要的ID作为参数而不是查询整个表吗?
这样的事情:
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)
对于这种情况,这将是一个更好的方法。
编辑:
好的,因为您使用的是表UDF而不是视图,我将假设它是一个多语句表UDF而不是内联。我很确定以这种方式使用UDF不会影响性能。
如果在Select
语句或Where
子句中使用UDF,性能将会受到影响。这是因为将从表返回的每一行调用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。