想了解使用存储过程的优缺点列表。 SP的主要优点似乎是预编译并从应用程序中抽象出数据。把你的想法告诉我......
答案 0 :(得分:34)
优势:为数据库(另一个抽象层)提供“公共接口”。
还将所有查询分组到同一位置,使DBA更容易查看数据库的查询方式并相应地对其进行优化。
缺点:可能不是放置复杂逻辑的最佳位置。但是,遵循复杂逻辑属于应用程序代码而不是存储过程的想法,存储过程变为简单的CRUD操作(每个表都有“创建”,“读取”,“更新”和“删除”过程)。在这种情况下,存储过程不会向应用程序添加任何值,它们只会使维护变得复杂并变得浪费。
查询全部组合在一起,因此很难看到应用程序的上下文。分析变更的影响的时间越长,变更的时间也越长。
因此:使用存储过程封装复杂查询(复杂连接,复杂where子句,......)。但是不要将存储过程用于复杂的应用程序/域/业务逻辑,也不要将存储过程用于CRUD。因此,应该在少数情况下使用存储过程,而不是应用程序中所有查询的标准工具。
组代码(包括查询)以实现“功能凝聚力”,而不是按工具/技术分组。要允许DBA根据查询方式优化数据库,请使用分析器。
答案 1 :(得分:11)
更正:它们是否经过预编译取决于数据库。例如,在SQL Server中,它们不是。存储过程和参数化SQL都在运行之前进行编译。如果存在相应的存储过程,存储过程有时可以重用执行计划......但参数化SQL也是如此。
修改: Here's what MSDN says about it:
SQL Server 2000和SQL Server 7.0版对语句处理进行了许多更改,这些更改将存储过程的许多性能优势扩展到所有SQL语句。 SQL Server 2000和SQL Server 7.0在创建存储过程时不保存部分编译的计划。与任何其他Transact-SQL语句一样,存储过程在执行时编译。 SQL Server 2000和SQL Server 7.0保留了过程高速缓存中所有SQL语句的执行计划,而不仅仅是存储过程执行计划。
答案 2 :(得分:10)
通过使用SP,您还可以避免让用户直接访问表。可以通过SP控制所有访问。
答案 3 :(得分:6)
重构更难。重命名或更改存储过程的位置可能会产生不良影响。
单元测试存储过程需要DB之外的代码帮助
答案 4 :(得分:5)
优点:存储过程可用于维护数据完整性并强制执行数据库策略,而无需依赖外部程序来执行此操作。
缺点:可以使调试更复杂。如果没有正确完成,也可能对在复制操作期间被丢弃敏感。
答案 5 :(得分:5)
使用当前的.Net 3.5框架库,我会使用Linq来执行大多数数据库操作。可能有些地方SP更有意义。但Linq也有规定运行SP。
关于SP的缺点,请查看以下链接 - 一个有趣的分析。查看博客文章的评论。
http://www.spoiledtechie.com/post/Whats-up-with-Stored-Procedures-these-days.aspx
答案 6 :(得分:4)
答案 7 :(得分:4)
缺点
答案 8 :(得分:4)
另一个缺点是版本控制,因为某些业务逻辑现在位于数据库端。你能从v2(现在)轻松回滚到v1(一年前)吗?
可行的解决方案是对存储过程名称进行版本控制。但是现在数据库混乱了旧的和新的存储过程。
答案 9 :(得分:3)
仅在构建应用程序时使用存储过程的几个原因:
答案 10 :(得分:2)
优势:您的数据库相关代码更有可能由对数据库工作感兴趣并且熟练掌握数据库工作的员工编写。
答案 11 :(得分:2)
优点:DBA可以添加应用程序不关心的行为。例如,在每行上存储修改日期。
答案 12 :(得分:2)
我在使用存储过程而不是在应用程序代码中编写相同逻辑时看到的优点是它可以减少应用程序对数据库的调用次数。
存储过程可以接受其参数并根据这些参数做出不同的决策和操作,而不是将结果返回给应用程序,然后应用程序做出决定并决定它需要执行另一个操作并进行另一个数据库调用
性能瓶颈几乎总是进程间通信。我尝试对数据库进行最少量的调用。
答案 13 :(得分:1)
优点:SP用于执行一组sql语句。 缺点:调试很复杂
答案 14 :(得分:1)
优势:运营团队可以监控或解决生产中的问题。
答案 15 :(得分:1)
另一个优势可能是在大型企业环境中,您可以拥有多个客户端应用程序和使用数据库的环境(例如Web,桌面,分布在不同操作系统上的报告工具)。对于某些业务规则更改,可以在数据库中进行更改,这在所有环境中都有效。
答案 16 :(得分:1)
-存储过程的优点
-存储过程的缺点。
答案 17 :(得分:0)
优点 -
答案 18 :(得分:0)
它增加了服务器上的负载。如果其他应用程序或多个应用程序使用相同的数据库服务器,则它们会变慢。
答案 19 :(得分:0)
简单的答案如下: adv:它是封装T-SQL代码最强大的结构。 它不仅限于SELECT,它支持所有DML代码。 它提供接收输入和直接返回输出。
dis:无法在SELECT中调用它,因此无法运行它 几条记录。