【问题标题】:Filtering results of a function takes much longer than filtering on the same query without a function过滤函数的结果比过滤没有函数的相同查询花费的时间要长得多
【发布时间】:2018-03-27 10:19:16
【问题描述】:

我有一个名为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 秒。

我该如何解决这个问题?

【问题讨论】:

  • IIF 和 ROWNUMBER 怎么样?

标签: sql optimization sql-function


【解决方案1】:

最大的区别:

  1. 您的表已编入索引,但您的函数结果(表)未编入索引。
  2. 您的表在连接之前应用了过滤器(while 子句)。所以它只加入了 3500 行。您的函数结果将包含所有行,然后它将加入,然后过滤。

如果您将过滤条件传递给您的函数,您将获得很大的收益,因此您返回的结果集较小。

如果您创建一个用于返回结果的表变量并在列BranchID 和ID 上放置一个索引,您也会获得很大的收益。这听起来需要做很多工作,但它可以解决你的两个性能问题(如果你仍然想坚持使用 table 函数。

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 2020-09-07
    • 2021-04-14
    • 2018-10-30
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多