交叉应用与表值功能限制性能
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。
您可以将此查询分成两部分,使用表变量或临时表
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
我相信这是你正在寻找的。
计划强制方案:创建计划指南以强制从重新编写的查询中获取计划
基本上它描述了重写查询以使用正确的连接顺序来获取生成的计划。 然后保存该计划并强制您的现有查询(不会更改)使用您保存的计划。
我放入的BOL链接甚至给出了一个重写查询的具体示例,将联接以不同的顺序并使用FORCE ORDER
提示。 然后使用sp_create_plan_guild
从重写的查询中获取计划并将其用于原始查询。
是和否......很难在没有样本数据IN和结果OUT的情况下混淆您试图实现的目标,以比较结果。
我想知道:
是否有任何设置或提示或力量选择只为最终受限制的行调用函数?
所以我会直接回答你的问题(3年后!!),并直接声明:
您需要了解CTE以及CROSS APPLY和INNER JOIN的区别,以及为什么在您的案例中使用CROSS APPLY是必要的。 您“可以”将函数中的代码应用到使用CTE的单个SQL语句中。
即:
阅读这个和这个。
基本上,这样的事情...
WITH t2o AS
(
SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
FROM t2
)
SELECT t1.*, t2o.*
FROM t1
INNER JOIN
t2o
ON t2o.t1_id = t1.id
AND t2o.rn <= 3
应用您的查询来推断您想要的ONCE的日期,然后使用CTE,然后使用CROSS APPLY应用第二个SQL。
你没有选择。 您无法在ONE SQL中执行您想要做的事情。
链接地址: http://www.djcxy.com/p/86215.html上一篇: CROSS APPLY with table valued function restriction performance