Stored procedures 存储过程和ORM';s

Stored procedures 存储过程和ORM';s,stored-procedures,Stored Procedures,与使用ORM(nHibernate、EF等)来处理某些CRUD操作相比,存储过程的用途是什么?要调用存储过程,我们只需传递几个参数,并使用ORM发送整个SQL查询,但这只是性能和安全问题,还是有更多的优势 我问这个问题是因为我从来没有使用过存储过程(我只是用ORM编写所有SQL语句并执行它们),一位客户告诉我,在我的下一个项目中,我必须使用存储过程,我正试图找出何时使用它们。我主要坚持使用linq to SQL作为ORM,我认为它很棒,但存储过程仍然有一席之地。当我想要运行的查询非常复杂,有很多

与使用ORM(nHibernate、EF等)来处理某些CRUD操作相比,存储过程的用途是什么?要调用存储过程,我们只需传递几个参数,并使用ORM发送整个SQL查询,但这只是性能和安全问题,还是有更多的优势


我问这个问题是因为我从来没有使用过存储过程(我只是用ORM编写所有SQL语句并执行它们),一位客户告诉我,在我的下一个项目中,我必须使用存储过程,我正试图找出何时使用它们。

我主要坚持使用linq to SQL作为ORM,我认为它很棒,但存储过程仍然有一席之地。当我想要运行的查询非常复杂,有很多连接(特别是外部连接,它吸收了Linq)、子查询中的大量聚合、递归CTE以及其他类似场景时,我主要使用


不过,对于一般的crud,不需要这样做。

存储过程通常是用SQL方言编写的(T-SQL用于SQL Server、PL-SQL Oracle等)。这是因为它们为SQL添加了额外的功能,使其更强大。 另一方面,您有一个ORM,比如说生成SQL的NH

ORM生成的SQL语句没有编写t-SQL存储过程的速度和能力。 这里是进退两难的地方:我需要与SQL数据库供应商绑定的超高速应用程序,很难维护,还是需要灵活,因为我需要针对多个数据库,而且我更喜欢通过编写HQL查询而不是SQL查询来缩短开发时间

存储过程比SQL语句更快,因为它们是在数据库引擎中预编译的,执行计划是缓存的。在NH中不能这样做,但您还有其他选择,比如使用缓存级别1或2

另外,尝试使用NH进行批量操作。存储过程在这些情况下工作得非常好。你需要考虑SP在更深层次上与数据库的对话。


选择可能并不那么明显,因为这一切都取决于您正在处理的场景

我发现它们的主要用途是实现抽象层和封装查询逻辑。与我用过程语言编写函数的方式相同。

在某些情况下,存储过程具有显著的性能优势。通常,由Linq和其他ORM生成的查询可能效率低下,但仍足以满足您的需要。一些RBDM(如SQL Server)将缓存存储过程的执行计划,从而节省查询时间。对于您经常使用的更复杂的查询,这种性能节约可能非常关键


不过,对于大多数普通的CRUD,我发现如果ORM可用并且其操作满足您的需要,那么仅使用ORM通常对可维护性更好。实体框架在.NET世界中的大多数时间(与Linq结合使用)都运行得很好,我非常喜欢PHP。

正如le dorfier提到的,应该使用存储过程(和/或视图)的主要原因之一是在数据库和它的客户机(web应用程序、报表、ETL等)之间提供一个抽象层

这种“DBAPI”可以使更改/重构数据库变得更容易,而不必影响客户端

请参阅--要获得更深入的讨论,您应该使用存储过程的主要原因(我想说的是“唯一”)是您是否真的需要性能

在数据库中创建能够快速完成复杂任务的“函数”似乎很有诱惑力。但它可能很快失控

我所使用的应用程序在SQL中封装了如此多的业务逻辑,以至于几乎不可能重构任何东西。事实上,数百个存储过程是开发人员使用ORM的黑盒

这样的应用程序变得脆弱、难以调试和理解。通过允许业务逻辑存在于存储过程中,您就允许SQL开发人员在一个比ORM更难使用、记录和调试的工具中做出他们不应该做出的设计选择。我见过处理付款处理的存储过程。真正核心的东西。对于一个应用程序来说,这些东西变得如此重要,以至于没有人敢碰它,所有这些都是因为一些拥有良好SQL技能的人用5年时间编写了一个脚本来快速修复某些东西,但它从未迁移到ORM,最终发展成一个无法管理的怪物,充满了没有人理解的混乱逻辑。开发者最终不得不盲目地相信它所做的一切。更糟糕的是,它几乎总是在测试覆盖范围之外,所以在部署时,您可能会破坏一切,即使您的测试通过了模拟数据,但一些古老的存储过程突然开始出现问题

滥用存储过程是您可能积累的最糟糕的技术债务形式之一。数据库是持久层,不应用于业务逻辑。你应该尽可能严格地区分

当然,在某些情况下,ORM会有糟糕的性能,或者根本不支持您需要的SQL特性。如果在原始SQL中做事情是不可避免的,那么只有在考虑存储过程时,


我见过存储过程地狱。你不会想要的。

我被这个相当老的问题绊倒了,但我很震惊,存储过程最重要的好处竟然没有被提及

安全和资源保护

使用SP,您可以将该SP的执行权限授予用户。用户可以执行SP,并且只能执行该SP。您甚至不必授予用户对所用表的读或写访问权限。用户甚至不必知道所使用的表

使用ORM,您必须为所使用的表和用户提供读或写访问权限。用户可以从您授予权限的所有表中读取所有数据,甚至可以在查询中组合这些数据(如果需要)