想获得使用存储过程的优缺点列表.SP的主要优点似乎是预编译并从应用程序中抽象出数据.给我你的想法....
优点:为数据库(另一个抽象层)提供"公共接口".
还可以在同一位置对所有查询进行分组,从而使DBA更容易查看数据库的查询方式并相应地对其进行优化.
缺点:可能不是放置复杂逻辑的最佳位置.但是,遵循复杂逻辑属于应用程序代码而不是存储过程的想法,存储过程变为简单的CRUD操作(每个表都有"创建","读取","更新"和"删除"过程).在这种情况下,存储过程不会向应用程序添加任何值,它们只会使维护变得复杂并变得浪费.
查询全部组合在一起,因此很难看到应用程序使用它们的上下文.分析变更的影响的时间越长,变更的时间也越长.
因此:使用存储过程来封装复杂查询(复杂连接,复杂where子句,...).但是不要将存储过程用于复杂的应用程序/域/业务逻辑,也不要将存储过程用于CRUD.因此,应该在少数情况下使用存储过程,而不是应用程序中所有查询的标准工具.
分组代码(包括查询)以实现"功能凝聚力"而不是按工具/技术分组.要允许DBA根据查询方式优化数据库,请使用分析器.
更正:它们是否预编译取决于数据库.例如,在SQL Server中,它们不是.存储过程和参数化SQL都在运行之前进行编译.如果存在相应的存储过程,则存储过程有时可以重用执行计划......但参数化SQL也是如此.
编辑: 以下是MSDN对此的评价:
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语句的执行计划,而不仅仅是存储过程执行计划.
通过使用SP,您还可以避免让用户直接访问表.可以通过SP控制所有访问.
重构更难.重命名或更改存储过程的位置可能会产生不良影响.
单元测试存储过程需要DB外部的代码帮助
您无需进行部署即可进行更改.
有时更快
更容易扩展系统
使用当前的.Net 3.5框架库,我将使用Linq来执行大多数数据库操作.可能有些地方SP更有意义.但Linq也有规定运行SP.
关于SP的缺点,请查看以下链接 - 一个有趣的分析.查看博客文章的评论.
http://www.spoiledtechie.com/post/Whats-up-with-Stored-Procedures-these-days.aspx
优点:存储过程可用于维护数据完整性并强制实施数据库策略,而无需依赖外部程序来执行此操作.
缺点:可以使调试更复杂.如果没有正确完成,也可能对复制操作期间被丢弃敏感.