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_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 ...
Run Code Online (Sandbox Code Playgroud)
我想知道:
是否有任何设置或提示或强制选择仅为最终受限制的行调用函数?
谢谢.
编辑:
表值函数非常复杂: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 ...
Run Code Online (Sandbox Code Playgroud)
现在做耗时的部分,即表值函数吧
SELECT * FROM #tempresult
CROSS APPLY dbo.HeavyTableValuedFunction(#tempresult.ID) AS htvf
Run Code Online (Sandbox Code Playgroud)