Thomas Zhang的杂货铺
13 02, 2008
相同的SQL不同的hash_value
作者 tomszrp 21:19 | Permalink 静态链接网址 | Comments 最新回复 (1) | Trackback 引用 (0) | 磨刀石

今天在分析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不一样了。


Comments

其实还是不同的SQL了

作者 yxyup 15 02 2008, 16:55
发表评论
标题:


称呼:


邮箱地址(可选):


个人主页(可选):


发表评论:
Bold Italic Link authimage




博客日历
« 七月 2008 »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
搜索
最新发表
文章分类
文章归档
网站链接
新闻聚合