表值函数 我的查询计划去哪儿了?
我刚刚将一个复杂的 SQL 语句包装在 SQLServer 2000 上的表值函数中。 当查看 SELECT * FROM dbo.NewFunc 的查询计划时,它只是对我创建的表进行表扫描。
我猜测这是因为表是在 tempdb 中创建的,而我只是从中进行选择。
所以查询很简单:
SELECT * FROM table in tempdb
我的问题是:
UDF 是否使用与复杂 SQL 语句相同的计划?
如何调整该 UDF 的索引?
我能看到真正的计划吗?
I've just wrapped a complex SQL Statement in a Table-valued function on SQLServer 2000.
When looking at the Query Plan for a SELECT * FROM dbo.NewFunc it just gives me a Table Scan of the table I have created.
I'm guessing that this is because table is created in tempdb and I am just selecting from it.
So the query is simply :
SELECT * FROM table in tempdb
My questions are:
Is the UDF using the same plan as the complex SQL statement?
How can I tune indexes for this UDF?
Can I see the true plan?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
多语句表值函数 (TVF) 对于外部查询的优化器来说是黑匣子。您只能从分析器中看到 IO、CPU 等。
TVF 必须运行完成并在进行任何处理之前返回所有行。这意味着 where 子句将不会被优化。
因此,如果此 TVF 返回一百万行,则它已首先排序。
单语句/内联 TVF 不会受到影响,因为它们像宏一样进行扩展和评估。上面的示例将评估索引等。
这里也有: 查询计划优化器是否可以与连接/过滤的表值函数配合良好? 和 Microsoft SQL Server 2008 中 JOIN 与 APPLY 的相对效率
准确回答:不,不,不,
我非常一些多语句 TVF:在我这样做的地方,我有很多参数要在 UDF 中过滤。
Multi-statement table valued functions (TVF) are black boxes to the optimiser for the outer query. You can only see IO, CPU etc from profiler.
The TVF must run to completion and return all rows before any processing happens. That means a where clause will not be optimised for example.
So if this TVF returns a million rows, it has be sorted first.
Single statement/inline TVFs do not suffer because they are expanded like macros and evaluated. The example above would evaluate indexes etc.
Also here too: Does query plan optimizer works well with joined/filtered table-valued functions? and Relative Efficiency of JOIN vs APPLY in Microsoft SQL Server 2008
To answer exactly: no, no, and no
I have very few multi statement TVFs: where I do, I have lots of parameters to filter inside the UDF.