在SQL中使用PL/SQL函数(四)

2014-11-24 17:02:13 · 作者: · 浏览: 3
Table: EMP_TEST Alias: EMP_TEST
Card: Original: 999.000000 Rounded: 10 Computed: 9.99 Non Adjusted: 9.99
Access Path: TableScan
Cost: 3.10 Resp: 3.10 Degree: 0
Cost_io: 3.00 Cost_cpu: 3232407
Resp_io: 3.00 Resp_cpu: 3232407
Best:: AccessPath: TableScan
Cost: 3.10 Degree: 1 Resp: 3.10 Card: 9.99 Bytes: 0
CBO没有函数FUN_TEST的统计信息,无法获得选择度,因此采用了默认的1%选择度进行处理.
虽然在SQL中使用PL/SQL函数存在很多问题,存在性能开销,但oracle一直在努力试图拉近SQL和PL/SQL的距离。
如可以使用NO_MERGE、QB_NAME等HINT来减少SQL中PL/SQL函数执行的次数,oracle还提供了函数结果集缓存、标量子查询缓存、DETERMINISTIC函数等技术来减少函数的执行次数.
对于CBO,oracle也提供了基于函数的索引,提供了扩展的统计信息、扩展的优化器、自定义统计信息函数等技术来提高SQL中执行PL/SQL函数的性能.
---
但是总体来说,我们应当尽量使用SQL来代替PL/SQL函数(也就是能用SQL解决的问题,绝不用PL/SQL),如确实需要使用PL/SQL函数的时候,我们可以使用视图、可以使用建立虚拟列等技术来避免在SQL中使用PL/SQL函数.