DB中的存储函数和视图有啥区别?

Posted

技术标签:

【中文标题】DB中的存储函数和视图有啥区别?【英文标题】:What is the difference between Stored Functions and Views in DB?DB中的存储函数和视图有什么区别? 【发布时间】:2011-12-02 07:24:02 【问题描述】:

我没有弄清楚存储函数视图之间的区别。 在 SELECT 中使用 Views 将执行查询并返回结果,但是 Stored Functions 做同样的事情,不是吗?那么区别是什么呢?我什么时候使用Views,什么时候使用Stored Functions

【问题讨论】:

可能重复:***.com/questions/988373/… 【参考方案1】:

查看: 视图是虚拟的table。它确实实际存在。相反,它是由查询joining 一个或多个tables 创建的。查看returns a table

存储过程:存储过程是一组Transact-SQL 语句编译成一个执行计划。 存储过程returns Output parameters,return codes(始终为整数值), 存储过程中包含的每个SELECT 语句的结果集或存储过程调用的任何其他存储过程,一个可以在存储过程之外引用的全局游标。存储过程的主要优点强>是Precompiled executionreduced client/server trafficefficient reuse of codeprogramming abstractionenhanced security controls

更新:

存储函数是一个命名的 PL/SQL 块,它类似于一个过程。过程和函数之间的主要区别在于,函数必须始终返回一个值,但过程可能会也可能不会返回值。 1)返回类型:标题部分定义了函数的返回类型。返回数据类型可以是任何 oracle 数据类型,如 varchar、number 等。 2) 执行部分和异常部分都应该返回一个在标题部分中定义的数据类型的值

【讨论】:

但我说的是函数而不是过程。 我以为您的意思是存储过程,但请查看更新后的答案,谢谢。 还有一个视图不能传入参数,SP和SF可以。此外,PL/SQL 也有 SP。【参考方案2】:

您可以让存储函数返回与大多数数据库中的视图相同的数据。

对我来说区别是执行一个函数,从中选择一个视图。

视图将表现为表格。

【讨论】:

您还可以拥有可供选择的函数(至少在 Oracle 和其他人中,对于 SQL Server 不是 100% 确定) 是的,我知道,这更像是一种心理上的区别。【参考方案3】:

视图将特定的预定义语句作为一个结果集返回。

函数返回单个值或单个结果集。但是,这可能因不同类型的数据库而异。

几个 db 实现也有存储过程,其中结果可以是单个返回值、一个结果集或多个结果集。

【讨论】:

【参考方案4】:

变得简单(请开始阅读有关 SQL 的书):视图看起来像一个表,因此您可以过滤结果,过滤器将有效地成为视图执行或连接的一部分。 SP不允许这样做,但更多的逻辑。其余的……在文档中。

【讨论】:

【参考方案5】:

这些永远无法比较,它们完全不同 接近。

一个视图是一个queryoutput,对表格做了一个virtual image,不接受输入参数。

主要区别在于存储过程可以更改您的数据,其中 作为一个视图只返回它,我相信从性能的角度来看 看来,存储过程更好,因为它缓存了执行计划和 结果会跑得更快。

storedprocedure/function 是一组预先执行的 sql 语句,它接受参数。它减少网络流量,提供更快的性能等。

编程语言中的 SQL 函数是用于封装经常执行的逻辑的子例程。这些会降低性能。

检查这些SQL View、SQL Stored Procedures 和SQL User-Defined Functions

我的意见是 SQL 存储过程(存储函数)更好用,因为它还提供了对结果集的自定义操作。

【讨论】:

【参考方案6】:

根据我的经验,我向您分享我的知识:

不要使用视图 最好使用存储过程(是编译好的sql语句),可以根据需要使用参数化过程。 Stored Function是编译好的sql语句的集合,速度更快。

注意:Views 是一个 SELECT 语句(带/不带 JOIN),用于从表中选择数据的表,如果我们再次从 VIEWS 运行 SELECT 语句,由于内部操作提供较慢的结果为(SELECT * FROM ( SELECT * FROM TargetTable )

所以,最好使用存储函数

更新:

函数是计算值,不能执行永久环境更改为 SQL Server(即不允许 INSERT 或 UPDATE 语句)。

如果函数返回标量值,则可以在 SQL 语句中内联使用,如果返回结果集,则可以连接。

另请参阅此处进行性能比较:SQL-Server Performance: What is faster, a stored procedure or a view?

【讨论】:

从视图中选择并不比运行等效的存储 SELECT 慢。 目前我知道,stored procedureView 快,我错了吗?感谢您的宝贵时间, 不,这个假设(作为一般规则)是错误的 - 至少对于 Oracle 而言,但我很确定 SQL Server 也是如此。 你好@a_horse_with_no_name,请看这里:***.com/questions/1603853/…,谢谢你的时间。 那篇文章正好证明了我的观点。如果过程和视图使用相同的语句,则没有性能差异。当然,如果他们以不同的方式做事(并且根据 SP 的实现方式,SP 可能会比视图慢或快),那么性能会有所不同。

以上是关于DB中的存储函数和视图有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 与oracle中的存储过程及函数有啥区别,尽可能详细哦

mysql和db2有啥区别

存储过程和表值函数有啥区别?

Mysql查看存储过程函数视图触发器表

C++ Map中的数据存储方式是啥?Map和HashMap有啥区别?

SQL SERVER2008 存储过程表视图函数的权限