存储过程听起来不错:
- 在数据库内运行应用程序逻辑,避免应用程序和数据库服务器之间不必要的往返和通信开销。
- 而且性能提升是真实的,可将复杂事务的延迟降低 2 倍以上。
那么为什么每个人都讨厌它们呢?
问题是存储过程对开发人员非常不友好。
- 它们必须用一种特殊的语言编写,通常是 PL/SQL 的方言。
- 它们必须与其他代码分开管理和部署。因为它们在数据库服务器中运行,所以很难调试或测试。
- 由于存储过程标准在数据库之间有所不同,因此会导致死锁。
网友:
- 存储过程面临的最大挑战之一:就是日志记录。
- 存储过程的另一个问题是:分片或分布式系统的问题
- 存储过程的另一个问题:如何处理故障情况,包括逻辑故障(违反约束)和意外故障(死锁、其他瞬时错误)。 对于任何非琐碎的事情,它很快就会变得一团糟,尤其是当你出于性能考虑而试图这样做的时候。
Postgres 中,你可以用几十种不同的语言编写存储过程,包括编译过的语言(如果你喜欢的话),比如 Java。 有工具可以测试它们,而且可以在数据库之外进行测试和调试。
可以使用 Flyway 或 Liquibase 等迁移工具进行部署。 使用 Oracle 时,可使用 utPLSQL 进行测试。
存储过程最初似乎很吸引人,但将其用于非琐碎的任务通常会在若干年后带来巨大的痛苦。 将应用逻辑拆分成接近数据库运行的微服务会更容易。 选择你喜欢的语言、CI/CD、git 等。
Oracle DB 提供: 编译 PL/SQL、批量 DML、并行查询/DML、结果缓存、UDF、SQL Transpiler、OJVM、JavaScript!
不可否认的是,我看到过一些系统因为存储过程而存活了很长时间(10 多年),而周围的应用程序却更换了好几次。
这就是我们提供更自然的语言来编写数据库逻辑的原因。