如何通过在 PL SQL 中根据需要声明 Cursor 来提高性能?

Posted

技术标签:

【中文标题】如何通过在 PL SQL 中根据需要声明 Cursor 来提高性能?【英文标题】:How to increase performance by declaring Cursor on need basis in PL SQL? 【发布时间】:2018-01-16 14:03:12 【问题描述】:

我有以下带有 2 个光标的代码。即使在需要调整之后,两者都是耗时的。 所以,我的想法是通过仅在需要的基础上调用游标 SQL 来提高函数的性能 基于一些已知条件。

现有代码:

Function MyFunction(Param1 IN DATE) RETURN BOOLEAN

CURSOR C1 IS <MyTimeConsumingQuery1>;

CURSOR C2 IS <MyTimeConsumingQuery2>;

IF NVL(KnownCondition,'Y') = 'N' THEN
  OPEN C1;

ELSE
 OPEN C2;

END IF; 

...
END MyFunction

以下是我想要实现的目标:

Function MyFunction(Param1 IN DATE) RETURN BOOLEAN

IF NVL(KnownCondition,'Y') = 'N' THEN

CURSOR C1 IS <MyTimeConsumingQuery1>;

  OPEN C1;

ELSE

CURSOR C2 IS <MyTimeConsumingQuery2>;

 OPEN C2;

END IF; 

...
END MyFunction

当我尝试编译代码时,我收到PLS-00103: Encountered the symbol 错误。

如何选择性地调用游标查询来提高性能?

【问题讨论】:

编译错误与您的问题“如何提高性能?”有什么关系? 我不确定我是否完全理解这个问题......在游标打开之前,游标查询的执行时间肯定是无关紧要的吗?也很难说出你真正在做什么,因为你已经离开了两个版本的声明/开始/结束 - 所以无法判断你是否在第二个版本中使用子块作为游标声明?另外,KnownCondition 是在编译时固定的,还是在函数内确定的? 提高性能是我想要实现的目标。获得编译错误是我想要实现的结果。我的重点是提高性能。 @AlexPoole “在游标打开之前,游标查询的执行时间肯定是无关紧要的吗?” - 你的意思是光标查询在打开之前不会“实际”执行?由于我是 PL SQL 的新手,请对此有所了解。 请先调查导致性能问题的原因:声明游标、打开游标或从中获取。然后只处理相关的部分。 【参考方案1】:

有很多方法可以做到这一点。举个例子

Function MyFunction(Param1 IN DATE) RETURN BOOLEAN is
begin
  IF NVL(KnownCondition,'Y') = 'N' THEN
    declare  
      CURSOR C1 IS <MyTimeConsumingQuery1>;
    begin
      OPEN C1;
      ...
    end;
ELSE
    declare  
      CURSOR C2 IS <MyTimeConsumingQuery2>;
    begin
      OPEN C2;
      ...
    end;
END IF; 

...
END MyFunction

【讨论】:

这与 OP 的原始结构有什么不同吗? 我对此表示怀疑 :) 但如果他自己检查会简单得多。 也许您应该查看 SQL 来解决您的性能问题?

以上是关于如何通过在 PL SQL 中根据需要声明 Cursor 来提高性能?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 和 Oracle Forms Builder

如何在 Oracle PL/SQL 过程的开始部分之后声明游标

PL/SQL复合变量

PL/SQL 用户自定义异常操作实例

如何在 oracle pl/sql 语句中声明查询?

如何像在 T-SQL 中一样在 PL/SQL 中声明和使用变量?