代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

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

  •  0
  • John Leidegren  · 技术社区  · 14 年前

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

    查询优化器在多大程度上能够对此类查询进行推理?

    如果表值udf不带参数,它们与traidnational视图有何不同?

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   codingbadger    14 年前

    难道您不将所需的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。 例如 Select col1, col2, dbo.MyUDF(col3) From MyTable

    Select col1, col2 from dbo.MyTable Where dbo.MyUDF(col3) != 1
    

    MyTable 包含100000行,您的UDF将被调用100000次。如果UDF需要5秒来执行,那么您将在其中遇到问题。