交叉应用与表值功能限制性能

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_TABLEANOTHER_TABLE只返回一行或几行。
  • 表值函数非常耗时,在调用很多行时,select会持续很长时间。
  • 我的问题:

    对于从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
    

    我相信这是你正在寻找的。

    计划强制方案:创建计划指南以强制从重新编写的查询中获取计划

    基本上它描述了重写查询以使用正确的连接顺序来获取生成的计划。 然后保存该计划并强制您的现有查询(不会更改)使用您保存的计划。

    我放入的BOL链接甚至给出了一个重写查询的具体示例,将联接以不同的顺序并使用FORCE ORDER提示。 然后使用sp_create_plan_guild从重写的查询中获取计划并将其用于原始查询。


    是和否......很难在没有样本数据IN和结果OUT的情况下混淆您试图实现的目标,以比较结果。

    我想知道:

    是否有任何设置或提示或力量选择只为最终受限制的行调用函数?

    所以我会直接回答你的问题(3年后!!),并直接声明:

    您需要了解CTE以及CROSS APPLY和INNER JOIN的区别,以及为什么在您的案例中使用CROSS APPLY是必要的。 您“可以”将函数中的代码应用到使用CTE的单个SQL语句中。

    即:

    阅读这个和这个。

    基本上,这样的事情...

    WITH    t2o AS
            (
            SELECT  t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
            FROM    t2
            )
    SELECT  t1.*, t2o.*
    FROM    t1
    INNER JOIN
            t2o
    ON      t2o.t1_id = t1.id
            AND t2o.rn <= 3
    

    应用您的查询来推断您想要的ONCE的日期,然后使用CTE,然后使用CROSS APPLY应用第二个SQL。

    你没有选择。 您无法在ONE SQL中执行您想要做的事情。

    链接地址: http://www.djcxy.com/p/86215.html

    上一篇: CROSS APPLY with table valued function restriction performance

    下一篇: Select Top 1 From a Table For Each Id in another Table