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

标签 oracle performance optimization plsql conditional-compilation

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

最佳答案

PL/SQL 的条件编译功能,更具体地说是错误指令,对于这种情况非常方便。在下面的示例中,我将优化级别设置为 1,然后尝试编译我的计算密集型过程。在该过程中,我通过 $$plsql_optimize_level 条件编译标志检查 session 中优化级别的值。如果小于 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

关于oracle - 如何确保 PL/SQL 程序在编译时启用了优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799661/

相关文章:

sql - 打印报表和性能

c - 使用类似函数的 marcos,有什么问题吗?

python - 为什么 Python3 在我的任务上比 Python2 慢很多?

c++ - 如何在 AVX2 中将 32 位无符号整数转换为 16 位无符号整数?

mysql - Oracle 与 MySql 数据库。哪个更快更有效?

oracle - perls dbi :Oracle table_info/column_info get their information from? 在哪里

php - CakePHP 2.2.0 多树重新排序性能

optimization - 分段 Meteor 应用程序 - 仅加载一半客户端或共享数据库的两个应用程序

sql - ORA-00904 : "ID": invalid identifier

oracle - 插入触发器是否需要提交语句