Oracle SQLID 与 Hash_value 之间的相互转化
- 博客分类:
- Oracle
一、什么是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
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
发表评论
-
查看当前Session SQL
2014-07-08 11:51 1038SELECT (SELECT listagg(b.sql_te ... -
CLOB列 XML信息查看
2014-05-28 10:28 979--使用该SQL查询节点情况 SELECT * FROM ... -
【转】ORACLE 临时表空间使用率过高的原因及解决方案
2012-12-25 15:24 926http://www.cnblogs.com/wonder31 ... -
oracle:获取session的IP地址
2012-10-20 02:38 4193方法1 创建触发器: create orreplace ... -
Oracle ora-01002
2012-08-11 02:43 28743ORA-01002:fetch超出序列 ... -
提高Oracle SQL的执行效率的3个方案
2012-08-08 00:57 946如果你想要提高Oracle SQL ... -
Oracle STA
2012-08-06 11:32 0第一步:创建优化任务 ... -
Oracle SQL小技巧
2012-08-06 11:21 01.两个字段可空的判断相等,用decode判断。 例子:d ... -
自动工作负载库(Automatic Workload Repository,AWR)
2012-07-23 22:45 1352自动工作负载库(Automatic Workload Repo ... -
orace的隔离级别
2012-07-21 01:06 1074隔离级别(isoation eve) 隔离级别定义了事务与 ... -
Oracle优化器和索引原
2012-07-13 00:34 1241Oracle优化器和索引原理 ============ ... -
Oracle优化器的RBO和CBO方式
2012-07-13 00:25 2373[/size]Or[size=large][size=smal ... -
Oracle 优化器详解
2012-07-13 00:18 1327一、优化器基本知识 Oracle在执行一个SQL之前,首先 ... -
SQL中使用WITH AS提高性能
2012-07-05 23:30 1147摘要:本文结合笔者实 ... -
Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题
2012-07-01 23:46 2072最近开始接触Oracle了,接触的越多越感受到自己的渺小!(o ... -
Oracle表连接操作——Hash Join(哈希连接
2012-05-20 17:05 0连接 http://space.itpub.net/?uid ... -
Oracle hash join
2012-05-20 17:00 872hash join是oracle里面一个 ... -
转--一次HASH JOIN 临时表空间不足的分析和优化思路
2012-05-20 15:36 4474最近遇到一个语句, 只要一执行这个语句就会出现报错临时表空间 ... -
SQL*PLUS SET 变量
2012-05-02 22:46 851SQL*PLUS SET变量 SQL*PLUS维护系 ... -
转---借助内存表处理复杂的oracle查询要求.
2012-03-25 23:23 1379借助内存表处理复杂的oracle查询要求. 在日常业务处理过 ...
相关推荐
查詢高消耗CPU的pid的SQL,SELECT /*+ ...DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid')) ORDER BY piece ASC
代码重点是hash_table,附加std::map与其做对比,实现的是一条sql语句:select c_nationkey, c_mktsegment, count(*), max(c_acctbal) from aaa_customer_1g group by c_nationkey, c_mktsegment order by c_...
关于hash_map的用法与解释: #include <hash_map> #include #include using namespace std; //define the class class ClassA{ public: ClassA(int a):c_a(a){} int getvalue()const { return c_a;} void ...
SQL_HASH_VALUE,SQL_ADDRESS:这两列用于鉴别默认被session执行的SQL语句。如果为null或0,那就说明这个session没有执行任何SQL语句。PREV_HASH_VALUE和PREV_ADDRESS两列用来鉴别被session执行的上一条语句。 注意...
hash_map
Hash值查看以及修改软件(Hash_1.0.4_0523.exe以及HashModifier.exe),网盘必备工具。
Hash_1.0.4.exe检验文件Hash,
文件MD5查看 Hash_1.0.4_XiaZaiBa.exe
MD5校验Hash_1.0.4 轻松复制各个参数 检验软件安全性
如果查到CPU的占用率非常高,取出PID,并查看对应的SQL语句 select vs.SID 会话id, vs.SERIAL# 会话SERIAL, vp.SPID 系统进程号, ... and vs.SQL_HASH_VALUE = vq.HASH_VALUE and vp.SPID = 3872 --换成对应的SPID
linux 下hash_map的基本原理及使用,希望对大家有帮助。
stm32f407平台上实现的hash算法
介绍了oracle中的hint,常用的 ordered、use_nl、use_hash、index、full 五种, 给出使用实例和适用场景
asp版hmac_sha1加密方式,支持中英文,真正和PHP的hash_hmac加密结果完全一样,与java、php、python、js 一致,附对比。支持中文utf-8编码
ash_sql_line_id.txt ash_top_sql_event.txt ash_used awr_db_time.txt awr_event_histogram.txt awr_metric_name.txt bind_noused.txt cursor_purge.txt ddl_metadata.txt dml_get fra_get param_get.txt redo_...
Hash分区是Oracle实现表分区的三种基本分区方式之一。对于那些无法有效划分分区范围的大表,或者出于某些特殊考虑的设计,需要使用Hash分区,下面介绍使用方法
Hash_1.0.4 hash值计算 hash值工具
Hash(md5校验工具)是一款小巧好用的哈希计算器,Hash也是一款md5校验工具,Hash支持文件拖放,速度很快,可以计算文件的 MD5、SHA1、CRC32 的值。