如何通过在 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 来提高性能?的主要内容,如果未能解决你的问题,请参考以下文章