存储过程不好在哪里?

存储过程是数据库中最受诟病的元素之一。

存储过程听起来不错:

  • 在数据库内运行应用程序逻辑,避免应用程序和数据库服务器之间不必要的往返和通信开销。
  • 而且性能提升是真实的,可将复杂事务的延迟降低 2 倍以上。

那么为什么每个人都讨厌它们呢?
问题是存储过程对开发人员非常不友好。

  • 它们必须用一种特殊的语言编写,通常是 PL/SQL 的方言。
  • 它们必须与其他代码分开管理和部署。因为它们在数据库服务器中运行,所以很难调试或测试。
  • 由于存储过程标准在数据库之间有所不同,因此会导致死锁。
虽然它们曾经很受欢迎,但开发人员已经意识到存储过程虽然带来好处,但是不值得为此付出代价。


网友:

  • 存储过程面临的最大挑战之一:就是日志记录。
  • 存储过程的另一个问题是:分片或分布式系统的问题
  • 存储过程的另一个问题:如何处理故障情况,包括逻辑故障(违反约束)和意外故障(死锁、其他瞬时错误)。 对于任何非琐碎的事情,它很快就会变得一团糟,尤其是当你出于性能考虑而试图这样做的时候。

Postgres 中,你可以用几十种不同的语言编写存储过程,包括编译过的语言(如果你喜欢的话),比如 Java。 有工具可以测试它们,而且可以在数据库之外进行测试和调试。

可以使用 Flyway 或 Liquibase 等迁移工具进行部署。 使用 Oracle 时,可使用 utPLSQL 进行测试。

存储过程最初似乎很吸引人,但将其用于非琐碎的任务通常会在若干年后带来巨大的痛苦。 将应用逻辑拆分成接近数据库运行的微服务会更容易。 选择你喜欢的语言、CI/CD、git 等。

Oracle DB 提供: 编译 PL/SQL、批量 DML、并行查询/DML、结果缓存、UDF、SQL Transpiler、OJVM、JavaScript!

不可否认的是,我看到过一些系统因为存储过程而存活了很长时间(10 多年),而周围的应用程序却更换了好几次。

这就是我们提供更自然的语言来编写数据库逻辑的原因。