我刚刚在 SQLServer 2000 上的表值函数中包装了一个复杂的 SQL 语句。在查看 SELECT * FROM dbo.NewFunc 的查询计划时,它只给了我创建的表的表扫描。
我猜这是因为表是在 tempdb 中创建的,我只是从中选择。
所以查询很简单:
SELECT * FROM table in tempdb
我的问题是:
UDF 是否使用与复杂 SQL 语句相同的计划?
如何调整此 UDF 的索引?
我能看到真正的计划吗?
我刚刚在 SQLServer 2000 上的表值函数中包装了一个复杂的 SQL 语句。在查看 SELECT * FROM dbo.NewFunc 的查询计划时,它只给了我创建的表的表扫描。
我猜这是因为表是在 tempdb 中创建的,我只是从中选择。
所以查询很简单:
SELECT * FROM table in tempdb
我的问题是:
UDF 是否使用与复杂 SQL 语句相同的计划?
如何调整此 UDF 的索引?
我能看到真正的计划吗?
多语句表值函数 (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 中过滤。