|
今天在分析SQL Shared问题的时候,无意中发现这个现象: 相同的SQL语句,在sqlplus,PL/SQL Developer的sql window和PL/SQL Developer command window下执行,居然得到不同的hash_value,自然这3个同样的SQL也就不能share了。 下面这个现象的再现过程: STUDY SQL> alter system flush shared_pool; 系统已更改。 STUDY SQL> create table zrp as select * from dba_tables; 表已创建。 session 1(sqlplus) STUDY SQL> select count(*) from zrp; COUNT(*) ---------- 1529 STUDY SQL> SQL> select '#'||sql_text||'#',sql_id,optimizer_mode,hash_value,address,plan_hash_value,module,action 2 from v$sqlarea 3 where sql_text like 'select count(*) from zrp%'; '#'||SQL_TEXT||'#' SQL_ID OPTIMIZER_MODE HASH_VALUE ADDRESS PLAN_HASH_VALUE MODULE ACTION ---------------------------- ------------- -------------- ---------- -------- --------------- ---------- ------------ #select count(*) from zrp# f1wuz71rax4ck ALL_ROWS 1856934290 6A553FE0 2384080583 SQL*Plus SQL> session 2(PL/SQL Developer的sql window) select count(*) from zrp; COUNT(*) ---------- 1529 SQL> select '#'||sql_text||'#',sql_id,optimizer_mode,hash_value,address,plan_hash_value,module,action 2 from v$sqlarea 3 where sql_text like 'select count(*) from zrp%'; '#'||SQL_TEXT||'#' SQL_ID OPTIMIZER_MODE HASH_VALUE ADDRESS PLAN_HASH_VALUE MODULE ACTION ----------------------------- ------------- -------------- ---------- -------- --------------- ----------------- -------------------- #select count(*) from zrp# f1wuz71rax4ck ALL_ROWS 1856934290 6A553FE0 2384080583 SQL*Plus #select count(*) from zrp # 52g7v6f6mpt7j ALL_ROWS 2369447153 6A69DDB0 2384080583 PL/SQL Developer SQL Window - New SQL> session 3(PL/SQL Developer command window) SQL> SQL> select count(*) from zrp; COUNT(*) ---------- 1529 SQL> select '#'||sql_text||'#',sql_id,optimizer_mode,hash_value,address,plan_hash_value,module,action 2 from v$sqlarea 3 where sql_text like 'select count(*) from zrp%'; '#'||SQL_TEXT||'#' SQL_ID OPTIMIZER_MODE HASH_VALUE ADDRESS PLAN_HASH_VALUE MODULE ACTION ------------------------------ ------------- -------------- ---------- -------- --------------- ------------------ -------------------- #select count(*) from zrp# f1wuz71rax4ck ALL_ROWS 1856934290 6A553FE0 2384080583 SQL*Plus #select count(*) from zrp # 52g7v6f6mpt7j ALL_ROWS 2369447153 6A69DDB0 2384080583 PL/SQL Developer SQL Window - New #select count(*) from zrp # 07fva4h7jj4p6 ALL_ROWS 253268646 6A4A9C9C 2384080583 PL/SQL Developer Command Window - New SQL> 通过上面对v$sqlarea的query 可以看到,实际是相同的SQL在执行的过程中,发生了变化,也就是传到Oracle去parse的 时候,并不完全是相同的SQL语句,在PL/SQL Developer SQL Window和PL/SQL Developer Command Window中分别在语句 的末尾增加了1个和2个空格.所以自然得到的hash_value不一样了。
|