【发布时间】:2013-04-20 14:06:14
【问题描述】:
我对带有参数化表值函数的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。
【问题讨论】:
-
陈述显而易见的可能:如果您可以更改查询文本中连接的顺序。那么您可以使用 FORCE_ORDER 查询提示。代码是如何生成的?你有没有办法改变那方面的行为?
-
将您的
dbo.HeavyTableValuedFunction(..)多行表值函数更改为内联表值函数。 -
@RBarryYoung:过于复杂,无法简单地重写为内联函数
-
@PavelHodek 啊,这就是导致您的问题的原因,所以如果您不向我们展示,我们也无能为力。
-
@RBarryYoung:表值函数:pastebin.com/w6azRvxR 和我们所说的选择:pastebin.com/bFbanY2n
标签: sql-server performance restriction cross-apply