SQL Server和表值用户定义函数优化

时间:2010-04-29 07:44:11

标签: sql-server-2005 tsql

如果我有一个UDF返回一个包含数千行的表,但我只想要该行集中的特定行,那么SQL Server是否能够有效地处理这个行?

DECLARE @pID int; --...
SELECT * FROM dbo.MyTableUDF(@pID)
WHERE SomeColumn BETWEEN 1 AND 2 OR SomeOtherColumn LIKE 'this_pattern&'

查询优化器在多大程度上能够推断出这种类型的查询?

如果没有参数,表值UDF与traidtional视图有何不同?

我应该知道的任何问题?

1 个答案:

答案 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。