sql-server - CROSS APPLY 与表值函数限制性能

标签 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 ...
  • LOT_OF_ROWS_TABLE 上的内部选择返回许多行。
  • 连接表 LOT_OF_ROWS_TABLEANOTHER_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/

相关文章:

sql - 如何保存 SQL Server Management Studio 中的更改

sql - 使用从列到两列的递归查询

c++ - 分支预测和分支目标预测之间的性能差异?

c++ - 在类实例或方法的上下文中调用函数以进行性能分析

C# 和 Entity Framework - 为具有不确定家谱的自引用实体优化数据库查询

google-places-api - Google Places 自动完成国家/地区限制

sql - tSQL 检查输入 ID 是否有效以及日期是否在当前年份

sql - 如何解决 SSIS 包中 OLE DB 目标中的非空约束?

owl - 在Protege中添加限制

c - 没有输入时如何在scanf()中检测?