5

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

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

所以查询很简单:

SELECT * FROM table in tempdb

我的问题是:

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

如何调整此 UDF 的索引?

我能看到真正的计划吗?

4

1 回答 1

7

多语句表值函数 (TVF) 是外部查询优化器的黑盒子。您只能从分析器中看到 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 中过滤。

于 2009-09-16T11:28:43.427 回答