内联函数和视图之间的区别

时间:2009-06-12 18:51:53

标签: sql sql-server sql-server-2005

我是使用函数的新手,在我看来,内联函数与视图非常相似。我是对的吗?

另外,我可以在函数中使用UPDATE语句吗?

9 个答案:

答案 0 :(得分:16)

在阅读了这里的许多答案之后,我想指出一个内联表值函数和任何其他类型的函数(标量或多行TVF)之间存在很大差异。

内联TVF只是一个参数化视图。它可以像视图一样进行扩展和优化。在“返回结果”或类似之前不需要实现任何内容(尽管不幸的是,语法有RETURN

我发现内联TVF对视图的一个很大的好处是它确实强制要求参数化,而对于视图,你必须假设调用者将适当地加入或限制视图的使用。

例如,我们在DW中有许多大型事实表,其中包含典型的Kimball星型模型。我有一个以事实为中心的模型的视图,它没有任何限制地调用,将返回数亿行。通过使用具有适当参数化的内联TVF,用户无法意外地询问所有行。两者之间的表现在很大程度上难以区分。

答案 1 :(得分:3)

没有区别。它们都被扩展/取消内容放入包含的查询中。

注意:索引视图被视为不同,但仍可以展开,多值表函数是包含查询的黑盒子。

Tony Rogerson: VIEWS - they offer no optimisation benefits; they are simply inline macros - use sparingly

Adam Machanic: Scalar functions, inlining, and performance: An entertaining title for a boring post

Related SO question: Does query plan optimizer works well with joined/filtered table-valued functions?

Scary DBA (at the end)

最后,函数

中不允许写入表

编辑,在Eric Z Beard的评论和downvote之后...

问题和答案(不仅仅是我的)不是关于标量udfs。 “内联”表示“内联表值函数”。非常不同的概念......

答案 2 :(得分:2)

更新:看起来我错过了“内联”部分。但是,我在这里留下答案,以防有人想要阅读VIEW和常规功能之间的区别。

如果您只有一个执行SELECT并输出数据的函数,那么它们是相似的。然而,即使这样,它们也不一样,因为引擎可以优化VIEW。例如,如果运行SELECT * FROM view1 WHERE x = 10;并且您在映射到X的表字段上有索引,然后将使用它。另一方面,函数在搜索之前构建结果集,因此您必须在其中移动WHERE - 但是,这并不容易,因为您可能有许多列,并且您不能在同一个select语句中对所有这些列进行ORDER BY。

因此,如果比较视图和函数来完成对数据提供“视图”的相同任务,那么VIEW是更好的选择。

但是,功能可以做得更多。您可以执行多个查询,而无需使用JOINS或UNION连接表。您可以对结果执行一些复杂的计算,运行其他查询并将数据输出给用户。函数更像是能够返回数据集的存储过程,然后它们就像视图一样。

答案 3 :(得分:2)

似乎没有人提到过这个方面。

您无法在内联函数中使用Update语句,但您可以将Update语句写入,就好像它们是可更新的视图。

答案 4 :(得分:1)

一个很大的区别是函数可以获取参数,而VIEW则不能。

我倾向于赞成VIEW,它是标准的,因此也是便携式实现。如果没有WHERE子句,等效的VIEW没有意义,我会使用函数。

例如,我有一个查询相对较大的有效时间状态表('history'表)的函数。如果这是一个VIEW并且您试图在没有WHERE子句的情况下查询它,那么您将获得大量公平的数据(最终!)使用函数建立合同,如果您需要数据,则必须提供客户ID,开始日期和结束日期,功能是我建立这种联系的方式。为什么不存储过程?好吧,我希望用户想要将结果集加入到更多数据(表,VIEW,函数等)中,而函数是IMO最好的方法,比如说,要求用户将结果集写入临时表

答案 5 :(得分:1)

回答有关函数更新的问题(msdn):

  

唯一可以做出的改变   函数中的语句是   更改到本地对象   功能,如本地游标或   变量。对数据库的修改   表,对游标的操作   不是本地的功能,发送   电子邮件,尝试目录   修改,并生成结果   返回给用户的set   不能采取的行动的例子   在一个函数中执行。

答案 6 :(得分:0)

视图是从查询返回的数据的“视图”,几乎是伪表。函数返回通常从查询数据派生的值/表。如果函数最终返回值/表,则可以在函数中运行任何sql语句。

答案 7 :(得分:0)

一个函数允许您传入参数以创建更具体的视图。假设您希望根据州获取客户。一个函数可以让你传递你正在寻找的状态,并在那个状态下给你所有的客户。视图无法做到这一点。

答案 8 :(得分:-1)

一个函数执行任务或许多任务。视图通过查询检索数据。什么适合该查询也是你有限的。在一个函数中,我可以更新,选择,创建表变量,删除一些数据,发送电子邮件,与我创建的CLR交互等等。比低视图更强大!