Oracle PL / SQL存储过程编译器与PostgreSQL PGSQL存储过程编译器

时间:2011-12-03 23:29:58

标签: oracle postgresql stored-procedures

我注意到Oracle需要一段时间来编译存储过程,但它的运行速度比它的PostgreSQL PGSQL快得多。

使用PostgreSQL,相同的过程(即所有的SQL-92格式都包含select和where子句中的函数)编译时间更短,但运行时间更长。

是否有一个指标网站,我可以在存储过程,SQL解析,视图和ref_cursors上找到Oracle和PostgreSQL的性能指标?

PostgreSQL PGSQL编译器缺少优化例程吗? Oracle如何处理存储过程与PostgreSQL如何处理它们之间的主要区别是什么?

我正在考虑编写一个PGSQL函数库,它允许PL / SQL代码在PGSQL中编译和运行。 (即DECODE,NVL,GREATEST,TO_CHAR,TO_NUMBER,全部 PL / SQL函数)但我不知道这是否可行。

3 个答案:

答案 0 :(得分:1)

这是一个难以回答的问题,因为它可以运行得非常深,但我会将2美分加到答案的高水平贡献上。首先,我真的很喜欢PostgreSQL,我真的很喜欢Oracle。然而,PL / SQL比PL / PGSQL提供的语言/环境要深得多,或者实际上我遇到的任何其他数据库引擎程序语言都是如此。 Oracle至少10G使用PL / SQL优化编译器。这很有可能导致它在用例中编译速度变慢的原因。 PL / SQL也有本机编译。您可以使用简单的编译器指令将PL / SQL代码编译为机器代码。这对于计算密集型逻辑而言不适用于SQL逻辑。我的观点是,Oracle已经花费了大量资源,从功能的角度和性能的角度来看PL / SQL是一个真正的好处,我只谈了两个例子.PL / SQL比PG / SQL要早几年这就是它总结的结果,我认为PG / SQL不会很快赶上甲骨文。

我怀疑你会找到一个并排的比较,虽然我认为这将是非常好的。这样做的努力可能不值得大多数人的时间。 此外,我不会重写已有的内容。

http://www.pgsql.cz/index.php/Oracle_functionality_(en)

答案 1 :(得分:1)

没有像TPC for SQL这样的存储过程的官方基准(参见tpc.org)。我也不知道任何具有特定PL / SQL和pgSQL实现的数据库应用程序可用作基准。

两种语言都被编译并优化为中间代码,然后由解释器运行。 PL / SQL 可以编译为机器代码,这并没有像人们想象的那样提高整体性能,因为解释器非常有效,典型的应用程序在SQL引擎上花费的时间最多,而不是在程序代码(see AskTom article)。

当过程代码调用SQL时,它就像在任何其他程序中一样,使用语句和绑定参数进行输入和输出。 Oracle能够保持这些SQL“准备好”,这意味着游标可以在没有额外的SQL“软解析”的情况下再次使用(通常只有在数据库首次运行SQL时才会发生SQL“硬解析”)它开始了。)

当在select或where子句中使用函数时,数据库必须在SQL和过程引擎之间来回切换。这可能比代码本身消耗更多的处理时间。

两个编译器之间的主要区别在于Oracle维护了一个依赖树,这使得PL / SQL在底层对象发生更改时自动重新编译。在没有实际运行代码的情况下检测到编译错误,而Postgres不是这种情况(see Documentation

答案 2 :(得分:0)

  

是否有一个指标网站,我可以找到并排的Oracle vs   关于存储过程的PostgreSQL性能指标,SQL解析,   views和ref_cursors?

公开对Oracle性能进行基准测试可能违反了许可条款。如果您是公司用户,请确保在执行此类操作之前对其进行合法检查。

  

我正在考虑编写一个允许的PGSQL函数库   要在PGSQL中编译和运行的PL / SQL代码。 (即DECODE,NVL,   GREATEST,TO_CHAR,TO_NUMBER,所有PL / SQL函数)但我不知道   如果这是可行的。

请检查手册并确保您需要所有这些,因为有些已经作为内置函数实现。此外,我似乎还记得一组附加功能,以提高Oracle的兼容性。

最后,不要忘记PostgreSQL提供了如何编写函数的选择。简单的可以用纯SQL编写(并在某些情况下自动内联),对于繁重的工作,我更喜欢使用Perl(你可能喜欢Python或Java)。