sql-server – 具有表值函数限制性能的CROSS APPLY
发布时间:2020-12-12 06:36:45 所属栏目:MsSql教程 来源:网络整理
导读:我有CROSS APPLY与参数化表值函数的问题. 这是简化的伪代码示例: SELECT * FROM ( SELECT lor.* FROM LOT_OF_ROWS_TABLE lor WHERE ...) AS lorCROSS APPLY dbo.HeavyTableValuedFunction(lor.ID) AS htvfINNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
我有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时数据是否受限. 选择必须采用所示的格式 – 它是生成的,实际上它更加困难. 当我尝试重写它时,它可以非常快,但它不能像这样重写: 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. 解决方法您可以使用表变量或临时表将此查询分为两部分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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |