过滤函数的结果比没有函数的同一查询过滤花费更长的时间

时间:2018-03-27 10:19:16

标签: sql optimization sql-function

我有一个名为LocalItems的函数,其中包含@LanguageID参数:

CREATE FUNCTION [dbo].[LocalItems] 
(   
    @LanguageID INT
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT Items.*, Products.Name, Products.BrandID
    FROM Items
    INNER JOIN LocalProducts(@LanguageID) AS Products
        ON Items.ProductID = Products.ID 
)

当我对函数的结果应用过滤器时:

SELECT *
FROM LocalItems(0)
WHERE BrandID IN(50,51) AND ID < 3500

结果查询需要12分钟(!!!)才能返回3500条记录。当我直接运行查询时:

SELECT Items.*, Products.Name, Products.BrandID
FROM Items
INNER JOIN LocalProducts(3) AS Products
    ON Items.ProductID = Products.ID 
WHERE BrandID IN(50,51) AND ID < 3500

查询需要5秒钟才能执行。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

差异很大:

  1. 您的表已编入索引,但您的函数结果(表)不是。
  2. 您的表在连接之前应用过滤器(while子句)。所以它只加入3500行。你的函数结果将包含所有行,然后它将加入,然后过滤。
  3. 如果您将过滤条件传递给函数,您将获得巨大收益,因此您返回的结果集较小。

    如果您创建了一个用于返回结果的表变量并在列BranchIDID上添加索引,那么您也会获得巨大收益。这听起来像很多工作,但它可以解决你的两个性能问题,(如果你仍然想坚持使用表函数。