【问题标题】:Table Valued Function where did my query plan go?表值函数我的查询计划去哪儿了?
【发布时间】:2024-04-29 04:10:02
【问题描述】:

我刚刚在 SQLServer 2000 上的表值函数中包装了一个复杂的 SQL 语句。 在查看 SELECT * FROM dbo.NewFunc 的查询计划时,它只会给我一个我创建的表的表扫描。

我猜这是因为表是在 tempdb 中创建的,我只是从中选择。

所以查询很简单:

SELECT * FROM table in tempdb

我的问题是:

UDF 是否使用与复杂 SQL 语句相同的计划?

如何调整此 UDF 的索引?

我能看到真正的计划吗?

【问题讨论】:

标签: sql sql-server tsql sql-server-2000 user-defined-functions


【解决方案1】:

多语句表值函数 (TVF) 是外部查询优化器的黑盒。您只能从 profiler 中看到 IO、CPU 等。

在任何处理发生之前,TVF 必须运行完成并返回所有行。这意味着例如不会优化 where 子句。

所以如果这个 TVF 返回一百万行,它已经排在第一位了。

SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC

单语句/内联 TVF 不会受到影响,因为它们像宏一样扩展和评估。上面的示例将评估索引等。

这里也有:Does query plan optimizer works well with joined/filtered table-valued functions?Relative Efficiency of JOIN vs APPLY in Microsoft SQL Server 2008

准确回答:不,不,不

我的多语句 TVF 很少:我有很多参数要在 UDF 中过滤。

【讨论】: