有没有发现,v$session,v$sql,v$sqlarea,v$sqltext,v$sql_shared_cursor等试图连接的时候经常会用到hash_value,sql_id,但是他们2个之间到底有什么不可告人的关系呢?
Talnel以及评论的一坨人(包括jonathan)给了一个蛮不错的解释:

SQL_ID is just a fancy representation of hash value

sys@TESTDB>select kglnahsv, kglnahsh from x$kglob where kglnaobj ='select ''landrover'' from dual';

KGLNAHSV                            KGLNAHSH
--------------------------------- ----------
8605074c682c4c4da7d495aacf3751e2 3476509154
8605074c682c4c4da7d495aacf3751e2 3476509154 sys@TESTDB>select sql_id, hash_value, old_hash_value from v$sql where sql_text ='select ''landrover'' from dual'; SQL_ID HASH_VALUE OLD_HASH_VALUE
------------- ---------- --------------
agp4ppb7mfng2 3476509154 3053997704

同时,10g+提供了一个sql_id到hash_value转换的方法:

sys@TESTDB>select dbms_utility.SQLID_TO_SQLHASH('agp4ppb7mfng2') hash_value FROM DUAL;

HASH_VALUE
----------
3476509154

10g以后,他们的关系是这样的:

1)oracle 用MD5算法对library cache obj 进行哈希,生成一个128bit的hash value,也就是KGLNAHSV(16进制).
2)KGLNAHSV的低64bit作为SQL_ID(32进制).
3)KGLNAHSV的低32bit作为HASH_VALUE(10进制)

因为10g+的哈希算法变了,所以10g之前的hash_value其实v$sql.old_hash_value。

但是需要说的是,library cache obj实际上还是通过hash_value+address的方式来组织的,Tanel只说了sql_id的后4 bytes是hash_value,但是没有说前4 bytes代表什么含义,个人觉得KGLNAHSV中有一部分应该是代表了address的,因为既然hash_value是sql_id的子集,如果sql_id可以唯一确定一个obj,那单独用hash_value肯定会存在不同SQL_ID但HASH_VALUE冲突的情况,尽管目前没人遇到过或者证明过,以他得话来说,可能性是1 in 4 billion。

至于oracle推出SQL_ID的意义,Tanel认为只是hash_value的一个更友好的别名。按照jonathan的说法,以后的版本可能会逐渐淘汰4 bytes的HASH_VALUE,而改用8 bytes的SQL_ID(也许名字会不一样),因为他更精确。但是现有的代码很多地方都还使用的32-bit的hash_value,所以hash_value需要做到向后兼容,就像当初10g逐渐淘汰9i的哈希算法一样(v$sql.old_hash_value)。这可能就是sql_id的意义所在。

转载:http://www.johnnydb.com/2012/03/sql_id-vs-hash_value/

http://www.slaviks-blog.com/2010/03/30/oracle-sql_id-and-hash-value/

color: #800000;

sql_id VS hash_value的更多相关文章

  1. [转] sql_id VS hash_value

    有没有发现,v$session,v$sql,v$sqlarea,v$sqltext,v$sql_shared_cursor等试图连接的时候经常会用到hash_value,sql_id,但是他们2个之间 ...

  2. [20191012]使用bash从sql_id计算hash_value.txt

    [20191012]使用bash从sql_id计算hash_value.txt --//没有什么实际意义,仅仅验证方法是否可行.--//sql_id的计算是使用MD5算法进行哈希,生成一个128位的H ...

  3. 根据SQL_ID查询并杀会话

    Oracle 根据SQL_ID查询并杀会话,清空执行计划缓冲池2018年09月06日 10:31:40 小学生汤米 阅读数:4731. 查询最近五分钟内最高频次SQL,查看event select t ...

  4. Using dbms_shared_pool.purge to remove a single task from the library cache

    我们都知道可是使用 alter system flush shared_pool 来清除shared pool 信息,当时不能指定清除某个对象.因为在系统繁忙的时侯 使用 alter system f ...

  5. 自适应游标共享技术02(一个简单的例子来走近ACS)

    为了不让其他因素干扰实验,参数设置如下: optimizer_mode=ALL_ROWS(使用CBO) optimizer_features_enable=11.2.0.3(使用最新的优化参数) op ...

  6. 查看ORACLE执行计划的几种常用方法

    SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向. 执行计划的定义:执行目 ...

  7. 将指定SQL的执行计划从共享池删除的方法

    如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现.   对于 ...

  8. 40个DBA日常维护的SQL脚本--1113

    from itpub --1.查询碎片程度高的表--条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的bl ...

  9. oracle执行计划走偏处理步骤

    -- sql执行时间select a.EXECUTIONS,a.ELAPSED_TIME,a.ELAPSED_TIME/a.EXECUTIONS/1000/1000 as 秒,a.SQL_ID,a.H ...

随机推荐

  1. undefined reference to...

    wj@wj-Inspiron-:~/Downloads/LBD_Descriptor/build$ cmake .. -- Configuring done -- Generating done -- ...

  2. python multiprocessing 和tcp

    #用类方法 服务端 from socket import *from multiprocessing import Processimport os class Myprocess(Process): ...

  3. 10.23JS日记

    1.逻辑运算 ||  &&  ! ||:遇到第一个为true的值就中止并返回 &&:遇到第一个为false的值就中止并返回,如果没有false值,就返回最后一个不是fa ...

  4. laravel 服务提供者介绍和使用

    #安装传送门 安装composer,以及通过composer安装laravel #讲解使用 服务提供者这个具体表现都是围绕着依赖注入 在根目录config/app.php的providers中的数组中 ...

  5. poj 3279 Fliptile(二进制)

    http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...

  6. Next generation sequencing (NGS)二代测序数据预处理与分析

    二代测序原理: 1.DNA待测文库构建. 超声波把DNA打断成小片段,一般200--500bp,两端加上不同的接头2.Flowcell.一个flowcell,8个channel,很多接头3.桥式PCR ...

  7. BZOJ1833或洛谷2602 [ZJOI2010]数字计数

    BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...

  8. NC 6系初始化EJB

    6系开发时,调用远程接口去操作数据时,需先调用EJB. InvocationInfoProxy.getInstance().setUserDataSource(design); InvocationI ...

  9. [Jmeter] Run Command to generate a specific listener’s chart report

    Run Command to generate a specific listener’s chart report: Download cmdrunner-2.0.jar : https://jme ...

  10. eclipse项目两个红点

    Description Resource Path Location Type Unbound classpath container: 'JRE Sy 选中项目右键build path 选择libr ...