我在使用参数化表值函数时遇到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
仅返回一行或几行。 - 表值函数非常耗时,并且当调用大量 rows 选择持续很长时间。
我的问题:
对于从 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 ...
我想知道:
是否有任何设置或提示或其他内容强制 select 仅对最终受限行调用函数?
谢谢。
编辑:
表值函数非常复杂: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
关于sql-server - CROSS APPLY 与表值函数限制性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16235758/