因为绑定变量后不知道变量的具体值,会影响优化器的执行计划,看这个例子:

表中有10000行列a的值从1-10000

SQL> variable id number;
SQL> execute  :id :=9;
SQL> select * from t where a<:id;
|   0 | SELECT STATEMENT            |      |   500 | 13000 |     3   (0)|
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |   500 | 13000 |     3   (0)|
|*  2 |   INDEX RANGE SCAN          | I    |    90 |       |     2   (0)|

SQL> execute  :id :=9000;
SQL> select * from t where a<:id;
|   0 | SELECT STATEMENT            |      |   500 | 13000 |     3   (0)|
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |   500 | 13000 |     3   (0)|
|*  2 |   INDEX RANGE SCAN          | I    |    90 |       |     2   (0)|

1、当处理的数据比较小,解析时占响应时间比重比较大时,就要尽量避免硬解析,所以最好使用绑定变量

2、当处理的数据比较大,全表扫描时间占响应时间比较大时,就要尽量避免全表扫描,就尽量别用绑定变量,因为绑定变量会影响优化器的优化,增大全表扫描的可能性