Joh*_*lan 4 sql t-sql sql-server sql-server-2000 user-defined-functions
我刚刚在SQLServer 2000上的表值函数中包装了一个复杂的SQL语句.当查看SELECT*FROM dbo.NewFunc的查询计划时,它只是给我一个我创建的表的表扫描.
我猜这是因为table是在tempdb中创建的,我只是从中选择.
所以查询很简单:
SELECT * FROM table in tempdb
Run Code Online (Sandbox Code Playgroud)
我的问题是:
UDF是否使用与复杂SQL语句相同的计划?
如何调整此UDF的索引?
我能看到真正的计划吗?
多语句表值函数(TVF)是外部查询的优化器的黑盒子.您只能从Profiler中查看IO,CPU等.
在任何处理发生之前,TVF必须运行完成并返回所有行.这意味着例如,where子句不会被优化.
因此,如果此TVF返回一百万行,则首先进行排序.
SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC
Run Code Online (Sandbox Code Playgroud)
单个语句/内联TVF不会受到影响,因为它们像宏一样进行扩展并进行评估.上面的例子将评估索引等.
此处也是:查询计划优化器是否适用于已连接/已过滤的表值函数?和Microsoft SQL Server 2008中JOIN与APPLY的相对效率
准确回答:不,不,不
我只有很少的多语句TVF:我在哪里,我有很多参数可以在UDF内部进行过滤.
| 归档时间: |
|
| 查看次数: |
1911 次 |
| 最近记录: |