Oracle SQLID 与 Hash_value 之间的相互转化

本文介绍了SQLID和Hash_value的概念及其相互之间的转换方法。SQLID是根据SQL文本计算得出的128位编码,而Hash_value则是该编码的后32位。两者均可通过Oracle10g提供的函数包实现相互转换。
[size=large][b]一、什么是SQLID[/b][/size]


SQLID是根据SQL 文本,经过一系列的计算,最后变成了一组编码,这组编码有128位,其中把最后的64位给了SQLID。



[size=large][b]二、什么是Hash_value[/b][/size]


Hash_value与SQLID一样,也是根据SQL 文本,经过一系列的计算,最后变成了一组编码,不过它是那组编码的后32位组成。



[size=large][b]三、怎么进行相互转化[/b][/size]


在Oracle 10G当中,可以使用一个函数包进行转换:

我们先查出1条SQLID值,我们这里以”4523qnqku408z”这条语句作为转化对象。


1)oracle 用MD5算法对library cache obj 进行哈希,生成一个128bit的hash value,也就是KGLNAHSV(16进制).

2)KGLNAHSV的低64bit作为SQL_ID(32进制).

3)KGLNAHSV的低32bit作为HASH_VALUE(10进制)


这两者可以相互转换,在Oracle 10g中,提供了一个包函数,用于转换:

SQL> select sql_id,hash_value,dbms_utility.SQLID_TO_SQLHASH(sql_id) convert from v$sql where rownum <9;

SQL_ID HASH_VALUE CONVERT
------------- ---------- ----------
1fkh93md0802n 3657695316 3657695316
b39dwjz0a404c 3231842444 3231842444
93s9k7wvfs05m 921436339 921436339
50ph8shy0408h 1006764304 1006764304
g9sqp5dpas0mw 1789657724 1789657724
0j7j10ykus0uy 2779513694 2779513694
bwsx6utfbh15q 1555563702 1555563702
79uvsz1g1c168 1578501320 1578501320

8 rows selected.

可以看到dbms_utility的转换结果与数据库存储一致。Tanel Poder解析了这个算法:

SQL> define 1 = 1fkh93md0802n
SQL> @1
SQL>
SQL> select
2 lower(trim('&1')) sql_id
3 , trunc(mod(sum((instr('0123456789abcdfghjkmnpqrstuvwxyz',substr(lower(trim('&1')),level,1))-1)
4 *power(32,length(trim('&1'))-level)),power(2,32))) hash_value
5 from
6 dual
7 connect by
8 level <= length(trim('&1'))
9 /
old 2: lower(trim('&1')) sql_id
new 2: lower(trim('1fkh93md0802n')) sql_id
old 3: , trunc(mod(sum((instr('0123456789abcdfghjkmnpqrstuvwxyz',substr(lower(trim('&1')),level,1))-1)
new 3: , trunc(mod(sum((instr('0123456789abcdfghjkmnpqrstuvwxyz',substr(lower(trim('1fkh93md0802n')),level,1))-1)
old 4: *power(32,length(trim('&1'))-level)),power(2,32))) hash_value
new 4: *power(32,length(trim('1fkh93md0802n'))-level)),power(2,32))) hash_value
old 8: level <= length(trim('&1'))
new 8: level <= length(trim('1fkh93md0802n'))

SQL_ID HASH_VALUE
-------------------------------- ----------
1fkh93md0802n 3657695316
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值