![]() |
1
2
我可以在我的11.1.0.7数据库中重现这种行为。我不确定我有什么解释,但我确实有一个理论。 如果将extend调用移出循环并只向集合中添加200个元素,则性能降低将消失(请参见下文)。这让我相信问题不仅仅在于调用对象方法的行为——似乎存在一些交互作用,集合的低效扩展是1个元素200次,而不是200个元素1次。
这里推测一下,但也许编译器能够对调用进行一些优化,以扩展集合,如果对过程的调用可能会修改集合,则编译器无法(或不能够)进行这些调用。 作为对这种推测的快速测试,我创建了一个成员函数而不是成员过程,并调用了循环中的函数。由于函数不修改对象状态,它们不会排除我所猜测的那种优化。当然,如果我用成员函数创建对象类型,性能下降就消失了。
最后,在我看来,有问题的语句是extend,但是如果循环中没有任何东西能够修改对象,那么优化器就足够聪明,能够避免惩罚。 |
![]() |
2
1
我发现了,问题描述在 Using SELF IN OUT NOCOPY with Member Procedures :
所以,每次调用过程,我的整个对象都被复制了两次,而且随着大小的增加,复制时间越来越长。
解决方案是使用
仍然在没有参数的情况下调用
性能恢复正常:
|
![]() |
maddy · 如何根据oracle SQL中的某一列值进行排名 1 年前 |
![]() |
kiric8494 · 显示以元音开头和结尾的城市名称 2 年前 |
![]() |
Franz Biberkopf · Oracle:组合子查询和聚合函数 2 年前 |
![]() |
BitLauncher · 甲骨文-如何模拟位列和布尔和/或? 2 年前 |
![]() |
Arifullah · 如何从oracle中的列中删除特定的初始字符? 2 年前 |
![]() |
Anar · Oracle SQL用户定义函数 2 年前 |
![]() |
user1312312 · 如何为一组表编写通用触发器? 2 年前 |