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

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

所以查询只是:

SELECT * FROM table in tempdb

我的问题是:

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

如何调整此UDF的索引?

我能看到真正的计划吗?

有帮助吗?

解决方案

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

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

因此,如果此TVF返回一百万行,则首先进行排序。

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

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

此处也是:查询计划优化器是否适用于已加入/已过滤的表值函数? Microsoft SQL Server 2008中JOIN与APPLY的相对效率

准确回答:不,不,没有

我的多语句TVF很少:我这样做,我有很多参数可以在UDF内部进行过滤。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top