我有一个名为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秒钟才能执行。
我该如何解决这个问题?
答案 0 :(得分:0)
差异很大:
如果您将过滤条件传递给函数,您将获得巨大收益,因此您返回的结果集较小。
如果您创建了一个用于返回结果的表变量并在列BranchID
和ID
上添加索引,那么您也会获得巨大收益。这听起来像很多工作,但它可以解决你的两个性能问题,(如果你仍然想坚持使用表函数。