我在使用带有参数表值函数的时遇到了问题。 以下是一个简化的伪代码示例:
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
表仅返回一行或几行。 - 表值函数非常耗时,当调用大量行时,选择时间持续很长时间。
我的问题:
无论只连接ANOTHER_TABLE
数据会受限,函数都会对从LOT_OF_ROWS_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 ...
我想知道:
是否有任何设置、提示或其他东西可以强制select仅为最终受限行调用函数?
谢谢。
编辑:
该表值函数非常复杂:http://pastebin.com/w6azRvxR。 我们所讨论的选择是“用户配置”的并且生成的:http://pastebin.com/bFbanY2n。
dbo.HeavyTableValuedFunction(..)
多行表值函数更改为内联表值函数。 - RBarryYoung