存储过程与Vs. 查看

我已经使用了两个,但我不清楚的是,当我更喜欢一个在另一个。 我的意思是我知道存储过程可以采取参数…但我们真的可以仍然执行相同的事情使用视图太对了?

所以考虑性能和其他方面的时候,为什么我应该更喜欢一个呢?

那么,我会使用存储过程更好地封装代码和控制权限。

视图并不是真正的封装:它是一个扩展的macros。 如果你很快就开始join视图,你会有一些可怕的问题。 是的,他们可以join,但他们不应该..

说,视图是一个工具,它们有自己的位置(例如索引视图)像存储过程。

存储过程:存储过程是预编译的数据库查询,可提高数据库客户机/服务器应用程序的安全性,效率和可用性。 开发人员根据input和输出variables指定一个存储过程。 然后,他们在数据库平台上编译代码,并将其提供给应用程序开发人员用于其他环境(如Web应用程序)中。 所有主要的数据库平台,包括Oracle,SQL Server和MySQL都支持存储过程。 这项技术的主要优点是预编译执行带来显着的性能提升,客户端/服务器stream量减less,代码重用和抽象的开发效率提高以及赋予用户特定存储过程而不是底层数据库表的权限。

视图:数据库视图允许您创build在访问时即时生成的“虚拟表”。 视图作为一个SQL语句存储在数据库服务器上,该语句从一个或多个表中提取数据,并(可选)对该数据执行转换。 然后,用户可以像查看任何真正的数据库表一样查询视图。 通常使用视图来缓解安全性问题,通过向用户提供对数据库表的某个视图的访问,而无需访问基础表本身。

在这里输入图像说明

意见的优点是,他们可以像表格一样对待。 您可以使用WHERE从它们获取过滤的数据,join它们等等。 如果它们足够简单,甚至可以将数据插入到它们中。 与存储过程不同,视图还允许您为结果编制索引。

存储过程的主要优点是它们允许您合并逻辑(脚本)。 这个逻辑可能像IF / ELSE一样简单,或者更复杂,比如DO WHILE循环,SWITCH / CASE。

查看就像一个保存的查询语句,它不能包含复杂的逻辑或多个语句(超出使用union等)。 对于任何复杂或可通过参数定制的选项,您都可以select允许更大灵活性的存储过程。

在数据库体系结构中使用“视图”和“存储过程”的组合是很常见的,也许出于非常不同的原因。 有时候,在重新devise模式时,要实现向后兼容性,有时为了使数据在本地存储在表中(非非视图化视图)相比更易于操作。

大量使用Views可能会降低性能,因为SQL Server更难以优化这些查询。 但是可以使用索引视图,这些索引视图可以像索引表一样使用连接来提高性能。 在实现索引视图时,允许使用的语法有很多更严格的限制,并且在根据SQL Server版本实际使用索引视图时有很多细节。

认为视图比存储过程更像表。

我将存储过程的使用与需要向/从数据库发送/接收事务相关联。 也就是说,每当我需要发送数据到我的数据库,我使用一个存储过程。 当我想要更新数据或查询数据库以获取在我的应用程序中使用的信息时也是如此。

数据库视图非常适合用于提供给定表格中字段的子集,允许MS Access用户查看数据而无需修改数据,并确保您的报告将生成反向结果。

如果有某种表的组合,或者您一直想要查询的数据的子集(例如,具有其权限的用户),则视图很有用。 事实上,意见应被视为表格。

存储过程是“编译”的sql代码片断,因为它在哪里运行比随机的其他查询更优化。 存储过程中的sql代码的执行计划已经build立,因此执行运行比普通的sql语句稍微平滑。

存储过程:存储过程是预编译的数据库查询,可提高数据库客户机/服务器应用程序的安全性,效率和可用性。 开发人员根据input和输出variables指定一个存储过程。 然后,他们在数据库平台上编译代码,并将其提供给应用程序开发人员用于其他环境(如Web应用程序)中。 所有主要的数据库平台,包括Oracle,SQL Server和MySQL都支持存储过程。 这项技术的主要优点是预编译执行带来显着的性能提升,客户端/服务器stream量减less,代码重用和抽象的开发效率提高以及赋予用户特定存储过程而不是底层数据库表的权限。

视图:数据库视图允许您创build在访问时即时生成的“虚拟表”。 视图作为一个SQL语句存储在数据库服务器上,该语句从一个或多个表中提取数据,并(可选)对该数据执行转换。 然后,用户可以像查看任何真正的数据库表一样查询视图。 通常使用视图来缓解安全性问题,通过向用户提供对数据库表的某个视图的访问,而无需访问基础表本身。

两个理由。

如果不希望插入成为可能,请使用存储过程而不是视图。 在视图中插入可能不会给出它看起来要做的事情。 它会在表中插入一行,这个行可能与查询中的查询不匹配,那么这行将不会出现在视图中; 插入某处,但不是在声明看起来的地方。

如果你不能使用存储过程的结果从另一个存储过程(我永远不能使后者的工作,至less在MySQL)使用视图。

包含元组的视图relvars

存储过程是脚本。