我对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
而不管在 join 时数据将受到限制的事实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。