sql-server – 具有表值函数限制性能的CROSS APPLY

前端之家收集整理的这篇文章主要介绍了sql-server – 具有表值函数限制性能的CROSS APPLY前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有CROSS APPLY与参数化表值函数的问题.
这是简化的伪代码示例:
SELECT * 
FROM (
    SELECT lor.*
    FROM LOT_OF_ROWS_TABLE lor
    WHERE ...
) AS lor
CROSS APPLY dbo.HeavyTableValuedFunction(lor.ID) AS htvf
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID 
WHERE ...

>表上的内部选择LOT_OF_ROWS_TABLE返回许多行.
>连接表LOT_OF_ROWS_TABLE和ANOTHER_TABLE只返回一行或几行.
>表值函数非常耗时且需要大量时间
选择的行持续很长时间.

我的问题:

对于从LOT_OF_ROWS_TABLE返回的所有行,将调用函数,而不管在加入ANOTHER_TABLE时数据是否受限.

选择必须采用所示的格式 – 它是生成的,实际上它更加困难.

当我尝试重写它时,它可以非常快,但它不能像这样重写:

SELECT * 
FROM (
    SELECT lor.*
    FROM LOT_OF_ROWS_TABLE lor
    WHERE ...
) AS lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID 
CROSS APPLY dbo.HeavyTableValuedFunction(at.ID) AS htvf
WHERE ...

我想知道:

是否有任何设置或提示或强制选择仅为最终受限制的行调用函数的东西?

谢谢.

编辑:

表值函数非常复杂:http://pastebin.com/w6azRvxR.
我们正在谈论的选择是“用户配置”并生成http://pastebin.com/bFbanY2n.

解决方法

您可以使用表变量或临时表将此查询分为两部分
SELECT lor.*,at.* into #tempresult
FROM (
    SELECT lor.*
    FROM LOT_OF_ROWS_TABLE lor
    WHERE ...
) lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID 
WHERE ...

现在做表值函数的耗时部分吧

SELECT  * FROM #tempresult
CROSS APPLY dbo.HeavyTableValuedFunction(#tempresult.ID) AS htvf
原文链接:https://www.f2er.com/mssql/78557.html

猜你在找的MsSQL相关文章