设为首页 收藏本站
查看: 454|回复: 0

[经验分享] Oracle SQLID 与 Hash_value 之间的相互转化

[复制链接]

尚未签到

发表于 2016-8-6 19:18:38 | 显示全部楼层 |阅读模式
一、什么是SQLID


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



二、什么是Hash_value


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



三、怎么进行相互转化


在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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253876-1-1.html 上篇帖子: Oracle 物化视图 详细错误描述 查看方法 下篇帖子: oracle体系结构三部曲之内存结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表