与使用ORM(如nHibernate、EF等)处理一些CRUD操作相比,存储过程的目的是什么?调用存储过程时,我们只需传递几个参数,而使用ORM则发送整个SQL查询,但这仅仅是性能和安全问题,还有更多优势吗?
我之所以问这个问题,是因为我从未使用过存储过程(我只使用ORM编写所有SQL语句并执行),客户告诉我在我的下一个项目中将需要使用存储过程,我试图弄清楚何时使用它们。
与使用ORM(如nHibernate、EF等)处理一些CRUD操作相比,存储过程的目的是什么?调用存储过程时,我们只需传递几个参数,而使用ORM则发送整个SQL查询,但这仅仅是性能和安全问题,还有更多优势吗?
我之所以问这个问题,是因为我从未使用过存储过程(我只使用ORM编写所有SQL语句并执行),客户告诉我在我的下一个项目中将需要使用存储过程,我试图弄清楚何时使用它们。
存储过程通常是用SQL的一种方言编写的 (例如 SQL Server 的 T-SQL,Oracle 的 PL-SQL 等)。这是因为它们为 SQL 增加了额外的功能以使其更强大。
另一方面,你有一个 ORM,比如说 NH,它会生成 SQL。
由 ORM 生成的 SQL 语句不具备编写 T-SQL 存储过程的速度和能力。
这里进入了一个两难境地:我需要一个绑定到 SQL 数据库供应商的超快应用程序,难以维护;还是我需要灵活性,因为我需要面向多个数据库,并且我更喜欢通过编写 HQL 查询而不是 SQL 来缩短开发时间?
存储过程比 SQL 语句快,因为它们在数据库引擎中预编译,并缓存了执行计划。你在 NH 中无法做到这一点,但你有其他选择,比如使用 Cache Level 1 或 2。
此外,试图使用 NH 进行批量操作。在这些情况下,存储过程非常有效。你需要考虑 SP 在更深层次上与数据库交互的能力。
选择可能并不那么明显,因为所有都取决于你正在处理的情景。
我主要使用linq to sql作为ORM,我认为它非常好,但存储过程仍然有其存在的意义。主要是当我想要运行的查询非常复杂时,例如有许多连接(特别是外连接,在Linq中很糟糕),子查询中有大量聚合,递归CTE等类似情况。
但对于一般的crud操作,没有必要使用存储过程。