【问题标题】:Better languages than SQL for stored procedures [closed]存储过程比 SQL 更好的语言 [关闭]
【发布时间】:2008-12-04 06:49:04
【问题描述】:

我对使用 Transact-SQL 或 PL/SQL 等语言将一些业务逻辑实际提交到存储过程所需的限制和冗长感到越来越沮丧。我很想将一些当前的数据库转换为 Oracle 并利用它对 Java 存储过程的支持,但该选项目前不可用。

对于支持其他语言的存储过程的数据库,您会推荐哪些替代方案?

【问题讨论】:

  • @Kev 请打开这个问题。

标签: database stored-procedures


【解决方案1】:

在数据库管理器中使用更聪明的查询语言存在一些架构障碍。主要的是查询优化器。 SQL 的设计限制之一是它只能使用查询优化器可以访问的结构。这意味着该语言及其功能与查询执行引擎和查询计划优化器的功能紧密耦合。

另一个主要的设计限制是数据库系统的机械性质——数据库编程几乎是独一无二的,因为它有一个机械组件。查询性能受到磁盘磁头寻道和旋转延迟(所需数据到达磁头下的等待时间)的机械约束。

这有效地排除了许多可能使 SQL 更强大或更易于使用的巧妙抽象。许多数据库管理系统通过可用于编写脚本的过程替代方案来补充 SQL。但是,它们通过以下方式与 DBMS 交互 执行一系列由优化器单独处理的 SQL 查询。各种 DBMS 平台附带的这种类型的一些语言是:

  • Oracle'sPL/SQLembedded Java。 PL/SQL 是 实际上基于 Ada - 相当 现代标准的“​​老派”和 有一个遗留代码库,它使用它 必须保持向后兼容。 这不一定是最 愉快的编程环境,但 它确实有构造 设施,例如并行性和 相当灵活的类型系统。主要的之一 对 Java 存储过程的批评 在 Oracle 上,您正在为此付费 Oracle 基于容量的许可 您正在运行 JVM 的 CPU 开。

  • SQL Server CLR Integration。 有点类似于 Oracle 的 Java 存储过程,这允许 CLR 从 C#(或任何 .net 语言)加载到 SQL Server 实例并以几乎相同的方式执行 方式作为存储过程。 SQL 服务器 也有 用于制作的 PostgreSQL 风格的 API 通过 CLR 自定义聚合函数 整合及其他 混合 SQL/CLR 代码库的挂钩。

  • PostgreSQL 实际上是 系统后端语言 整合最初是 发达。系统导出一个native C API,并带有用于 自定义聚合函数,存储 引擎、程序扩展和其他 功能。 The language interfaces 基于此 API 并包括: PL/pgSQL(定制语言类似 到 PL/SQL), Python, PerlTcl

    这使它成为 主流通过Illustra,一个 Postgres 的商业化版本, 然后被 Informix(后来 被 IBM 收购)。钥匙 功能被纳入 Informix On-Line,即 仍然由 IBM 出售。

这些语言的一个主要限制是它们与查询的交互有限 优化器(尽管 PostgreSQL 的 C API 确实支持这一点)。参与 在查询计划中,作为一等公民要求查询优化器能够对您的操作将采取的资源做出合理的看法。在实践中,这种与查询优化器的交互主要用于实现存储引擎。

这种对存储引擎的深入研究是 (a) 如果功能完全可用(所以大多数人不具备这样做的技能),并且 (b) 可能比仅仅编写在 SQL 中查询。查询优化器的局限性意味着您可能永远无法从(例如)Python 甚至 C# 或 Java 中获得的 SQL 抽象级别。

高效查询阻力最小的路径可能是 用另一种语言中的一些程序胶水用 SQL 编写查询。在某些情况下,计算确实适用于程序方法。

这可能会变得很麻烦,并导致大量样板 SQL 代码。唯一真正的选择是手工编码的 SQL 或代码生成系统。代码生成的一个简单示例是框架提供的 CRUD 功能,其中此 SQL 是从元数据生成的。在 ETL 工具中可以看到更复杂的示例,例如 Oracle Warehouse BuilderWherescape Red,它们通过从模型中生成大量存储过程代码来工作。

正是出于这个原因,我发现自己在半定期的基础上构建了一种或另一种代码生成系统。任何模板系统都可以做到这一点 - 我从CherryTemplate 获得了相当不错的里程,但周围有很多这样的项目。 Code Generation in Action 是一本关于这个主题的好书——作者使用了一个基于 ruby​​ 的系统,它的名字让我无法理解。

编辑:如果您查看程序代码块的“显示估计执行计划”,您会注意到每个语句都有自己的查询计划。查询优化算法只能在单个 SQL 语句上工作,因此一个过程将有一个查询计划森林。因为过程代码可以有'side-effects',所以你不能使用查询优化中使用的type of algorithms 来推理代码。这意味着查询优化器无法全局优化程序代码块。它只能优化单个 SQL 语句。

【讨论】:

  • 内容太棒了!感谢所有的链接/指针。
  • 我同意 - 为精彩内容 +1。我仍然对某一点感到困惑。我的大多数存储过程都有许多 SELECT、INSERT、UPDATE 和/或 DELETE 语句。我认为查询优化充其量已经很困难,并且在语言选择方面不是一个重要问题。
  • 查看编辑 - 优化器为各个 select、insert、update 和 delete 语句生成一系列计划。
【解决方案2】:

PostgreSQL 支持多种脚本语言程序。正式 Perl、Python 和 Tcl。作为插件,PHPRubyJava 可能还有许多其他插件(对于 pl 来说只是 Google),它们现在可能处于工作状态,也可能不处于工作状态。

哦,SQL Server 2005 及更高版本还支持CLR stored procedures,您可以在其中使用 .NET 语言。

【讨论】:

    【解决方案3】:

    OracleHSQLDBDerby 允许用 Java 编写存储过程。

    【讨论】:

      【解决方案4】:

      Oracle 确实支持 CLR 存储过程,因此您可以使用任何 .NET 语言(如 C#、VB.NET 或 IronPython)编写存储过程。这仅在数据库服务器在 Windows 机器上运行时有效。当数据库在 Linux 或 Unix 上运行时,您不能这样做。

      【讨论】:

        【解决方案5】:

        据我所知,DB2 for Z/OS 是支持大多数语言的数据库。它支持COBOL,C/C++,JAVA作为存储过程,当然也支持SQL过程。

        【讨论】:

          【解决方案6】:

          还有一些支持编写Oracle存储过程in Perl

          【讨论】:

            【解决方案7】:

            由于 Oracle 具有内置 JVM,您可以使用 Java 开发存储过程,也可以使用使用 JVM 的非 Java 语言开发存储过程,这意味着像 JACL、JYTHON、SCHEME 和 GROOVY 这样的语言。见这里:http://db360.blogspot.com/2006/08/oracle-database-programming-using-java_01.htmlhttp://en.wikipedia.org/wiki/List_of_JVM_languages

            【讨论】:

              猜你喜欢
              • 2012-01-09
              • 1970-01-01
              • 1970-01-01
              • 2013-06-27
              • 1970-01-01
              • 2010-10-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多