与独立的过程和功能相比,软件包有什么好处?


13

寻找一个标准的答案,即为什么在Oracle数据库中应该优先使用软件包而不是独立的过程和功能。

Answers:


12

套餐的好处

逻辑分组 –可以将协同工作的方法放在一个内聚的单元中,而不仅仅是逻辑上耦合但在物理上是分开的。

安全的私有方法 -函数和过程可以对软件包私有,并且只能在其中使用。这使得公共表面更简单,更安全。

特权管理 –可以为一组可一起工作的过程授予一次权限,而不必为所需的每个过程/功能分别授予权限。

安全包装 -与包装的功能/程序相比,包装的包裹更难拆开。

简化的命名 –更大的名称空间允许使用更简单的名称,并且可以在其他程序包中重复使用。

更好的性能 –包可以被编译并完整地加载到内存中,而不是像其他方法那样零碎地加载。如果与其他收益相比,则根本没有收益。

减少无效性 –更改程序包主体不会像更改函数或过程那样使依赖项无效。

独特功能 -包变量,包常量,初始化,会话状态,包注释和重载方法。

参考:
11.2概念指南
询问Tom问题
StackOverflow.com有关包装性能
展开PL / SQL表示的问题(pdf)


2
我必须不同意性能优势。如果将代码加载到内存中是一个明显的等待事件,则发生了非常糟糕的事情。软件包很有可能会降低性能,因为当您只需要一个方法时,当您加载整个软件包时,您必须阅读更多的代码。但是,无论哪种情况,性能差异都无法测量。
贾斯汀·凯夫

@Justin-重点来自《 11.2概念指南》。它是这样说的:“更好的性能-第一次调用整个程序包中的过程时,整个程序包会以小块的形式加载到内存中。此负载是在一个操作中完成的,与独立运行所需的单独负载相反当发生对相关打包过程的调用时,不需要磁盘I / O来运行内存中的已编译代码。”
Leigh Riffel

4
我同意该文档声称可以提高性能。该文档不正确,或至少不足够。最好的情况是,“好处”的规模很小。收益的迹象尚不清楚。正如在读取大多数行时使用表扫描会更有效,而在读取单个行时使用索引访问会更有效一样,如果要执行以下操作,则一次性将整个程序包读取到内存中将是有益的使用每种方法,如果您只想使用一种方法,则不利。
贾斯汀·凯夫

1
@Justin-您的评估听起来合乎逻辑。我没有找到任何一种确定的方法,因此我在答案中添加了警告。感谢您的输入。
Leigh Riffel

我认为这种性能优势类似于缓存。如果仅使用该过程并且使用频率较低,则不会获得任何性能优势。但是,如果您经常使用它,并且此程序包中使用了任何其他过程,则可以获得好处。周围的开发人员都在使用缓存,因为不是真正的性能而是感知性能得到了改善。由于相关过程放在同一程序包中,因此逻辑上也将调用其他一些过程。这全都涉及在同一程序包中调用两个过程的可能性。通常,发生读取的可能性很高。
Atilla Ozgur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.