我刚刚完成一个复杂的SQL语句的表值函数上的SQLServer 2000年当在查询计划寻找一个SELECT * FROM dbo.NewFunc它只是给我我所创建的表的表扫描。
我猜,这是因为在tempdb中创建表,我只是从中进行选择。
因此查询很简单:
SELECT * FROM table in tempdb
我的问题是:
是UDF使用相同的计划,复杂的SQL语句?
如何为这个UDF我可以调指标?
我能看到真正的计划是什么?
我刚刚完成一个复杂的SQL语句的表值函数上的SQLServer 2000年当在查询计划寻找一个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
单语句/直列TVFs不会受到影响,因为它们是扩展宏,并进行评估。 上面的例子将评价指标等。
而且,这里太: 请问查询计划优化器与加盟/过滤表值函数行之有效? 与JOIN VS在Microsoft SQL Server 2008中APPLY的相对效率
要准确地回答:没有,没有,没有
我有很少的多语句TVFs:在我做的,我有很多的参数的UDF内进行过滤。