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

Sql server 2005 SQL Server和表值用户定义函数优化,sql-server-2005,tsql,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不带参数,它们与传统视图有何不同 有什么我

如果我有一个UDF,它返回一个包含数千行的表,但我只需要该行集中的一行,SQL Server能够有效地处理这个问题吗

DECLARE @pID int; --...
SELECT * FROM dbo.MyTableUDF(@pID)
WHERE SomeColumn BETWEEN 1 AND 2 OR SomeOtherColumn LIKE 'this_pattern&'
查询优化器在多大程度上能够对这种类型的查询进行推理

如果表值UDF不带参数,它们与传统视图有何不同


有什么我应该知道的问题吗?

您不把所需的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。 e、 g
从MyTable中选择col1、col2、dbo.MyUDF(col3)

因此,如果
MyTable
包含100000行,那么您的UDF将被调用100000次。如果UDF需要5秒钟才能执行,那么您将遇到问题


据我所知,你不打算以这种方式使用UDF

是的,但这不是我问题的答案。当然,如果它只是一个视图,那么我一开始就不需要UDF。返回表值上有大量的搜索准则,它们不能或不能作为参数使用。必须有效地处理这些问题。我对示例进行了一些更改,以更好地说明我的问题。抱歉造成混淆。UDF的想法是提供数据的参数化视图,不是吗?内联表UDF类似于使用视图,但是,多语句UDF允许您执行比传统视图多得多的逻辑。UDF可以用于比视图多得多的用途,例如,UDF可以递归使用。
Select col1, col2 from dbo.MyTable Where dbo.MyUDF(col3) != 1