bind_aware的实验过程如下:
SQL> alter system flush shared_pool;
系统已更改。
SQL> var vr number;
SQL> exec :vr := 1
PL/SQL 过程已成功完成。
SQL> select /*+ bind_aware */ sum(id) from t1 where rtype = :vr;
SUM(ID)
----------
1
SQL> @show_sql
SQL_TEXT EXECUTIONS I I I
------------------------------------------------------------ ---------- - - -
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 1 Y Y Y --由于使用了bind_aware HINT
SQL> @show_sel
ADDRESS HASH_VALUE SQL_ID CHILD_NUMBER PREDICATE RANGE_ID LOW HIGH
---------------- ---------- ------------- ------------ ---------------------------------------- ---------- ---------- ----------
00000000DD40C0E0 2679189014 082txyqgv2bhq 0 =VR 0 0.000007 0.000008 --根据直方图计算出rtype=1的选择性
SQL> exec :vr := 2
PL/SQL 过程已成功完成。
SQL> select /*+ bind_aware */ sum(id) from t1 where rtype = :vr;
SUM(ID)
----------
5
SQL> @show_sql
SQL_TEXT EXECUTIONS I I I
------------------------------------------------------------ ---------- - - -
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 1 Y Y N --逐步淘汰出内存
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 1 Y Y Y
SQL> @show_sel
ADDRESS HASH_VALUE SQL_ID CHILD_NUMBER PREDICATE RANGE_ID LOW HIGH
---------------- ---------- ------------- ------------ ---------------------------------------- ---------- ---------- ----------
00000000DD40C0E0 2679189014 082txyqgv2bhq 1 =VR 0 0.000007 0.000017 --由于rtype=2的选择性不再0.00007~0.00008之间,所以生成新的子游标,由于新游标和旧游标的执行计划相同,所以进行合并,子游标0被设置为非共享,逐步淘汰出内存
00000000DD40C0E0 2679189014 082txyqgv2bhq 0 =VR 0 0.000007 0.000008
SQL> exec :vr := 1
PL/SQL 过程已成功完成。
SQL> select /*+ bind_aware */ sum(id) from t1 where rtype = :vr;
SUM(ID)
----------
1
SQL> @show_sql
SQL_TEXT EXECUTIONS I I I
------------------------------------------------------------ ---------- - - -
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 1 Y Y N
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 2 Y Y Y --使用新的子游标,不再使用0号子游标
SQL> @sho_sel
SP2-0310: 无法打开文件 "sho_sel.sql"
SQL> @show_sel
ADDRESS HASH_VALUE SQL_ID CHILD_NUMBER PREDICATE RANGE_ID LOW HIGH
---------------- ---------- ------------- ------------ ---------------------------------------- ---------- ---------- ----------
00000000DD40C0E0 2679189014 082txyqgv2bhq 1 =VR 0 0.000007 0.000017
00000000DD40C0E0 2679189014 082txyqgv2bhq 0 =VR 0 0.000007 0.000008
SQL> exec :vr := 3
PL/SQL 过程已成功完成。
SQL> select /*+ bind_aware */ sum(id) from t1 where rtype = :vr;
SUM(ID)
----------
22
SQL> @show_sql
SQL_TEXT EXECUTIONS I I I
------------------------------------------------------------ ---------- - - -
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 1 Y Y N
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 2 Y Y N
select /*+ bind_aware */ sum(id) from t1 where rtype = :vr 1 Y Y Y
SQL> @show_sel
ADDRESS HASH_VALUE SQL_ID CHILD_NUMBER PREDICATE RANGE_ID LOW HIGH
---------------- ---------- ------------- ------------ ---------------------------------------- ---------- ---------- ----------
00000000DD40C0E0 2679189014 082txyqgv2bhq 2 =VR 0 0.000007 0.000034
00000000DD40C0E0 2679189014 082txyqgv2bhq 1 =VR