sql_id VS hash_value
有没有发现,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的更多相关文章
- [转] sql_id VS hash_value
有没有发现,v$session,v$sql,v$sqlarea,v$sqltext,v$sql_shared_cursor等试图连接的时候经常会用到hash_value,sql_id,但是他们2个之间 ...
- [20191012]使用bash从sql_id计算hash_value.txt
[20191012]使用bash从sql_id计算hash_value.txt --//没有什么实际意义,仅仅验证方法是否可行.--//sql_id的计算是使用MD5算法进行哈希,生成一个128位的H ...
- 根据SQL_ID查询并杀会话
Oracle 根据SQL_ID查询并杀会话,清空执行计划缓冲池2018年09月06日 10:31:40 小学生汤米 阅读数:4731. 查询最近五分钟内最高频次SQL,查看event select t ...
- Using dbms_shared_pool.purge to remove a single task from the library cache
我们都知道可是使用 alter system flush shared_pool 来清除shared pool 信息,当时不能指定清除某个对象.因为在系统繁忙的时侯 使用 alter system f ...
- 自适应游标共享技术02(一个简单的例子来走近ACS)
为了不让其他因素干扰实验,参数设置如下: optimizer_mode=ALL_ROWS(使用CBO) optimizer_features_enable=11.2.0.3(使用最新的优化参数) op ...
- 查看ORACLE执行计划的几种常用方法
SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向. 执行计划的定义:执行目 ...
- 将指定SQL的执行计划从共享池删除的方法
如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现. 对于 ...
- 40个DBA日常维护的SQL脚本--1113
from itpub --1.查询碎片程度高的表--条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的bl ...
- oracle执行计划走偏处理步骤
-- sql执行时间select a.EXECUTIONS,a.ELAPSED_TIME,a.ELAPSED_TIME/a.EXECUTIONS/1000/1000 as 秒,a.SQL_ID,a.H ...
随机推荐
- python 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
http://www.cnblogs.com/linhaifeng/articles/7580830.html 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数
- 金老师的经典著作《一个普通IT人的十年回顾》
学习人生 -------一个普通IT人的十年回顾(上)序从1994到2003,不知不觉之间,我已在计算机技术的世界里沉浸了十年.有位哲人说过:如果一个人能用十年的时间专心致志地 ...
- Android开发之使用SwipeRefreshLayout完成下拉刷新
SwipeRefreshLayout是V4包下的一个组件,老版本的V4包不支持这个组件功能.因此,如果发现自己的项目中无法导入SwipeRefreshLayout的包,那么说明项目中的V4包是老版本的 ...
- hadoop 启动的时候datanode报错 Problem connecting to server
刚配置好的hadoop,namenode可以正常开启,但是datanode却不停的报错,并且不能正常启动: 2014-05-04 10:43:33,970 WARNorg.apache.hadoop. ...
- Linux惊群效应详解
Linux惊群效应详解(最详细的了吧) linux惊群效应 详细的介绍什么是惊群,惊群在线程和进程中的具体表现,惊群的系统消耗和惊群的处理方法. 1.惊群效应是什么? 惊群效应也有人 ...
- (O)阻止默认事件和阻止冒泡的应用场景
场景1:阻止默认事件 比如这样的一个需求 点击取消a标签按钮的时候会触发一些js动作,但是不能让这个a标签产生跳转行为, 所以需要在点击取消的时候 阻止冒泡,防止其跳转. <a id='ca ...
- 单细胞测序技术(single cell sequencing)
单细胞测序技术(single cell sequencing) 2018-03-02 11:02 来源: 一呼百诺 点击次数:6587关键词: 前言 单细胞生物学最近几年是非常热门的研究方向 ...
- HDOJ2870 Largest Submatrix
一道\(DP\) 原题链接 发现只有\(a,b,c\)三种情况,所以直接初始化成三个\(01\)方阵,找最大子矩阵即可. 我是先初始化垂直上的高度,然后对每一行处理出每个点向左向右的最大延伸,并不断计 ...
- Nginx 如何限定IP访问
在nginx.conf中的server限制段中.deny IP.表示需要限制该IP不可访问.allow IP表示权该IP可以访问. 如上图.表示阻止192.168.1.122的IP的访问.那当然也可以 ...
- 在 Ubuntu 上使用微信客户端
原文地址: http://www.myzaker.com/article/5979115d1bc8e08c30000071/ 在这个快速信息交互时代,无论是工作还是生活,都需要频繁的网络社交,而在中国 ...