存储过程和ORM

时间:2011-03-17 23:41:02

标签: stored-procedures

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

我问这个因为我从未使用过存储过程(我只是用ORM编写所有SQL语句并执行它们),并且客户告诉我,我将不得不在下一个项目中使用存储过程,我想知道何时使用它们。

7 个答案:

答案 0 :(得分:32)

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

ORM生成的SQL语句与编写T-SQL存储过程的速度和功能不同。 这就是进退两难的地方:我是否需要与SQL数据库供应商捆绑的超快速应用程序,难以维护或者我需要灵活,因为我需要针对多个数据库,我更喜欢通过编写HQL查询来缩短开发时间而不是SQL的?

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

此外,尝试使用NH进行批量操作。存储过程在这些情况下非常有效。您需要考虑SP在更深层次上与数据库进行通信。

选择可能不那么明显,因为所有选择都取决于您正在处理的场景。

答案 1 :(得分:3)

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

对于大多数普通的CRUD,我发现,如果ORM可用并且其操作满足您的需要,通常可以更好地保持可用性。实体框架在.NET世界中大部分时间都适用于我(与Linq结合使用),我非常喜欢Pro的Propel。

答案 2 :(得分:2)

(我很想说“仅”)您应该使用存储过程的原因是,如果您确实需要性能。

我使用的应用程序将大量业务逻辑封装在SQL中,因此几乎不可能重构任何东西。从字面上看,数百个开发人员正在与ORM一起工作的存储过程并不知道他们做了什么。

此类应用程序变得脆弱,难以调试且难以理解。通过使业务逻辑存在于存储过程中,您可以使SQL开发人员使用比ORM困难得多的工具来做出他们不应该进行的设计选择。我见过处理付款处理的存储过程。真正核心的东西。对于应用程序来说,东西变得如此重要,以至于没人敢触摸它,这都是因为5年前有一些具有良好SQL技能的人编写了基本脚本,而该脚本应该做的要小得多。它从未迁移到ORM中,最终成长为无法控制的怪物,到处都是其他人无法理解的混乱逻辑。开发人员最终不得不盲目地信任它所做的一切。

你不想那样。

滥用存储过程是您可能积累的最糟糕的技术债务之一。

当然,在某些情况下,ORM的性能会很差,或者根本无法执行某些操作。在那种情况下,在原始SQL中做某些事情是不可避免的。但是,如果可以的话,请将其最小化。与往常一样,技术债务就像金融债务一样好,只要您知道何时使用它以及如何对其进行管理即可。

答案 3 :(得分:1)

我找到的主要用途是实现抽象层并封装查询逻辑。就像我用过程语言编写函数一样。

答案 4 :(得分:0)

我主要坚持使用linq作为ORM的sql,我觉得它很棒,但是仍然存在存储过程的地方。主要是我使用当我想运行的查询非常复杂,有很多连接(特别是外连接,在Linq中很糟糕),子查询中的大量聚合,递归CTE和其他类似场景。

但对于一般情况而言,没有必要。

答案 5 :(得分:0)

正如le dorfier所提到的,应该使用sprocs(和/或视图)的主要原因之一是在数据库及其客户端(Web应用程序,报告,ETL等)之间提供抽象层

这种“数据库API”可以更轻松地更改/重构数据库,而不必影响客户端。

请参阅 - Why use stored procs - 进行更深入的讨论

答案 6 :(得分:0)

我偶然发现了这个相当老的问题,但令我震惊的是,甚至没有提到存储过程的最重要好处。

安全和资源保护

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

使用ORM,您必须授予对使用的表和用户的读取或/和写入权限。用户可以从您被授予权限的所有表中读取所有数据,甚至可以将它们合并到查询中(如果需要),并且还可以运行查询,这会给数据库服务器带来沉重的负担。

在不同团队进行应用程序开发和数据库开发并且多个应用程序使用数据库的情况下,这特别有用。