如何确保在编译 PL/SQL 程序时启用了优化?

Posted

技术标签:

【中文标题】如何确保在编译 PL/SQL 程序时启用了优化?【英文标题】:How can I make sure a PL/SQL program is compiled with optimization turned on? 【发布时间】:2018-04-12 14:50:15 【问题描述】:

我有一个计算密集型 PL/SQL 过程。如果它没有在优化级别设置为至少 2 的情况下编译(是的,我知道这是默认值),那么性能很糟糕。如何确保始终编译此过程时将级别设置为 2 或更高?

【问题讨论】:

【参考方案1】:

PL/SQL 的条件编译特性,更具体地说是错误指令,在这种情况下非常方便。在下面的示例中,我将优化级别设置为 1,然后尝试编译我的计算密集型过程。在该过程中,我通过 $$plsql_optimize_level 条件编译标志检查会话中优化级别的值。如果小于 2,我强制编译错误。

ALTER SESSION SET plsql_optimize_level = 1
/

CREATE OR REPLACE PROCEDURE compute_intensive
AUTHID DEFINER
IS
BEGIN
   $IF $$plsql_optimize_level < 2
   $THEN
      $ERROR 
         'Compile compute_intensive at level 2 or higher!' 
      $END
   $END
   NULL;
END compute_intensive;
/

Errors: PROCEDURE COMPUTE_INTENSIVE
Line: 7 PLS-00179: $ERROR: compute_intensive must be compiled with maximum optimization!

ALTER SESSION SET plsql_optimize_level = 3
/

CREATE OR REPLACE PROCEDURE compute_intensive
AUTHID DEFINER
IS
BEGIN
   $IF $$plsql_optimize_level < 2
   $THEN
      $ERROR 'compute_intensive must be compiled with maximum optimization!' $END
   $END
   NULL;
END compute_intensive;
/

Procedure created.

用我的LiveSQL script自己试试吧。

更多关于条件编译的信息here。

【讨论】:

嘿,我最近读了你的文章On Conditional Compilation( COMPUTE_INTENSIVE_PROGRAM)。我也喜欢你的博客 :) 我希望 PL/SQL 对于未来的发展不会死 死了?天哪!新特性的速度已经放缓,主要是因为 PL/SQL 已经如此强大,并且已经为它作为一种数据库编程语言的目的而精心打磨。但绝对不会死,它将作为数据 API 发挥越来越重要的作用:javascript JSON REST PL/SQL package api SQL。谢谢!

以上是关于如何确保在编译 PL/SQL 程序时启用了优化?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL编程之变量

编译过程时 PL/SQL 工具包 Web 应用程序错误

PL/SQL 包编译错误:PLS-00323

优化 PL/SQL 代码 [关闭]

使用PL/Scope分析PL/SQL代码

编译时PL / Sql问题