CROSS APPLY具有表值函数限制性能

Pav*_*dek 9 sql-server performance restriction 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 ...
Run Code Online (Sandbox Code Playgroud)
  • 表上的内部选择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 ...
Run Code Online (Sandbox Code Playgroud)

我想知道:

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

谢谢.

编辑:

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

San*_*ara 3

您可以将此查询分为两部分,使用表变量或临时表

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 ...
Run Code Online (Sandbox Code Playgroud)

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

SELECT  * FROM #tempresult
CROSS APPLY dbo.HeavyTableValuedFunction(#tempresult.ID) AS htvf
Run Code Online (Sandbox Code Playgroud)