Oracle游标与绑定变量(二)

2014-11-24 12:30:57 · 作者: · 浏览: 2
dbms_stats.gather_table_stats(
ownname=>user,
tabname=>t,
estimate_percent=>100,
method_opt=>forallcolumnssize1
);
END;
/
EXECUTE:id:=990;
SELECTcount(pad)FROMtWHEREid<:id;
SELECT*FROMtable(dbms_xplan.display_cursor(NULL,NULL,basic));
EXECUTE:id:=10;
SELECTcount(pad)FROMtWHEREid<:id;
SELECT*FROMtable(dbms_xplan.display_cursor(NULL,NULL,basic));
我们发现当 id=10, 也就是查询非常小部分数据的时候,仍然执行的是全表扫描,如下图:

五. 绑定变量使用场景
什么时候应该使用绑定变量,什么时候又应该避免呢?
我们可以看到,使用绑定变量主要是为了避免硬解析,也就是加快SQL的解析时间,但是有可能导致 Oracle重用效率低下的执行计划。也就是延长SQL的执行时间。这个时候我们应该权衡,这条SQL是解析时间比较长还是执行时间。 www.2cto.com
1. 如果一次只处理小部分数据,解析时间等于或者高于执行时间,那么建议使用绑定变量。
2. 如果一次处理大批量数据,执行时间高于解析时间几个数量级,那么没必要使用绑定变量,加快那么一点解析时间微不足道。而且还有可能导致oracle重用效率低下的执行计划,大大影响SQL的执行速度。