一尘不染

表值函数查询计划去了哪里?

sql

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

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

所以查询很简单:

SELECT * FROM table in tempdb

我的问题是:

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

如何调整此UDF的索引?

我可以看到真实的计划吗?


阅读 150

收藏
2021-03-10

共1个答案

一尘不染

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

TVF必须运行完成并返回所有行,然后再进行任何处理。例如,这意味着将不会优化where子句。

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

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

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

同样在这里:查询计划优化器是否可以与联接/过滤的表值函数一起很好地工作?SQL Server
2008中JOIN与APPLY的比较和相对效率

确切回答:不,不,不

我只有很少的多语句TVF:在哪里,我有很多参数可以在UDF中进行过滤。

2021-03-10