我刚刚在SQLServer 2000的表值函数中包装了一个复杂的SQL语句。 查看SELECT * FROM dbo.NewFunc的查询计划时,它只是给了我创建的表的表扫描。表值函数我的查询计划去了哪里?
我猜这是因为表是在tempdb中创建的,我只是从中选择。
所以查询很简单:
SELECT * FROM table in tempdb
我的问题是:
是使用相同的计划,复杂的SQL语句中的UDF?
我该如何调整这个UDF的索引?
我可以看到真实的计划吗?
我刚刚在SQLServer 2000的表值函数中包装了一个复杂的SQL语句。 查看SELECT * FROM dbo.NewFunc的查询计划时,它只是给了我创建的表的表扫描。表值函数我的查询计划去了哪里?
我猜这是因为表是在tempdb中创建的,我只是从中选择。
所以查询很简单:
SELECT * FROM table in tempdb
我的问题是:
是使用相同的计划,复杂的SQL语句中的UDF?
我该如何调整这个UDF的索引?
我可以看到真实的计划吗?
多语句表值函数(TVF)是外部查询的优化器的黑色框。你只能从profiler中看到IO,CPU等。
TVF必须运行完成并在发生任何处理之前返回所有行。这意味着where子句不会被优化。
所以,如果这个TVF返回一百万行,它已经排序第一。
SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC
单一声明/内联TVF不会因为它们像宏一样扩展而被评估。上面的例子将评价指标等
而且,这里太:Does query plan optimizer works well with joined/filtered table-valued functions?和Relative Efficiency of JOIN vs APPLY in Microsoft SQL Server 2008
要确切地回答:没有,没有,没有
我已经很少多语句TVFs:这里我做什么,我有很多参数要在UDF内进行过滤。
您可以通过至少运行一次函数然后查看缓存来查看查询计划,例如:https://dba.stackexchange.com/a/198524/18190 – binki 2018-02-22 00:05:22