一、什么是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 1091SELECT (SELECT listagg(b.sql_te ... -
CLOB列 XML信息查看
2014-05-28 10:28 1027--使用该SQL查询节点情况 SELECT * FROM ... -
【转】ORACLE 临时表空间使用率过高的原因及解决方案
2012-12-25 15:24 1021http://www.cnblogs.com/wonder31 ... -
oracle:获取session的IP地址
2012-10-20 02:38 4310方法1 创建触发器: create orreplace ... -
Oracle ora-01002
2012-08-11 02:43 28956ORA-01002:fetch超出序列 ... -
提高Oracle SQL的执行效率的3个方案
2012-08-08 00:57 1004如果你想要提高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 1430自动工作负载库(Automatic Workload Repo ... -
orace的隔离级别
2012-07-21 01:06 1105隔离级别(isoation eve) 隔离级别定义了事务与 ... -
Oracle优化器和索引原
2012-07-13 00:34 1282Oracle优化器和索引原理 ============ ... -
Oracle优化器的RBO和CBO方式
2012-07-13 00:25 2403[/size]Or[size=large][size=smal ... -
Oracle 优化器详解
2012-07-13 00:18 1356一、优化器基本知识 Oracle在执行一个SQL之前,首先 ... -
SQL中使用WITH AS提高性能
2012-07-05 23:30 1255摘要:本文结合笔者实 ... -
Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题
2012-07-01 23:46 2137最近开始接触Oracle了,接触的越多越感受到自己的渺小!(o ... -
Oracle表连接操作——Hash Join(哈希连接
2012-05-20 17:05 0连接 http://space.itpub.net/?uid ... -
Oracle hash join
2012-05-20 17:00 955hash join是oracle里面一个 ... -
转--一次HASH JOIN 临时表空间不足的分析和优化思路
2012-05-20 15:36 4558最近遇到一个语句, 只要一执行这个语句就会出现报错临时表空间 ... -
SQL*PLUS SET 变量
2012-05-02 22:46 882SQL*PLUS SET变量 SQL*PLUS维护系 ... -
转---借助内存表处理复杂的oracle查询要求.
2012-03-25 23:23 1423借助内存表处理复杂的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
该视图提供了当前会话的执行信息,可以根据 SQL_ID 和 EXECUTIONS 字段来排序,找出当前正在执行的 TOP_SQL。 ### 方法五:通过 PLAN_HASH_VALUE 可以通过 PLAN_HASH_VALUE 来找到 TOP_SQL 的执行计划。该值可以与...
- 使用 `SQL_ADDRESS` 和 `SQL_HASH_VALUE` 或者 `PREV_SQL_ADDR` 和 `PREV_HASH_VALUE` 可以查询到当前会话执行的 SQL 语句的详细信息: ```sql SELECT * FROM v$sqltext WHERE address = :sql_address AND hash...
Hash函数是一种加密算法,它将任意长度的输入(也叫做预映射或消息)转化为固定长度的输出,这个输出就是哈希值。常见的Hash算法有MD5(Message-Digest Algorithm 5)、SHA-1(Secure Hash Algorithm 1)、SHA-256等...
### Oracle消耗资源的SQL查询语句记录 在Oracle数据库管理中,监控和优化SQL查询是确保系统性能稳定的关键环节之一。对于那些消耗大量资源的SQL语句进行记录和分析可以帮助DBA快速定位问题并采取相应的优化措施。...
代码重点是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_...
3. **解析次数**:`PARSING_USER_ID` 和 `PARSING_SCHEMA_ID` 分别记录了SQL语句的解析用户和模式,而`COUNT(*)` 列则显示了SQL语句被解析的总次数。 4. **执行信息**:`EXECUTIONS` 列显示SQL语句的执行次数,`...
### hash_map详解 #### 0. 为什么需要hash_map? 在软件开发中,经常会遇到需要高效存储和查找键值对(key-value)的情况。例如,在管理人物名称及其相关信息时,我们希望能够快速地添加、查找和更新数据。传统的...
`gen_lex_hash`的运行结果会生成`lex_hash.h`头文件,这个文件包含了所有可能的SQL关键字和标识符的哈希值,确保MySQL能正确解析和理解输入的SQL指令。 对于PC平台,由于硬件资源相对丰富,但可能与MySQL服务器的...
WHERE AO.OBJECT_ID = LO.OBJECT_ID AND LO.SESSION_ID = SESS.SID; ``` 这个查询提供了锁定对象的基本信息,包括锁定模式等。 #### 5. 查询特定会话执行的SQL语句地址 如果想要更精确地定位某个会话正在执行的...
AND sql_hash_value = hash_value; ``` **功能说明:** 此查询用于监控正在长时间运行的SQL语句,显示了执行这些语句的用户、会话ID、操作名称、进度、剩余时间以及SQL文本。 ### 11. 查询分区信息 ```sql ...
这里提供的知识是基于黄玮编写的《Oracle高性能SQL引擎剖析:Oracle SQL优化与调优技术详解》一书的内容,以及上述文档提供的相关知识点。在实际应用中,可以参考这些内容来优化Oracle数据库中的SQL查询。同时,为了...
hash_map
Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于处理无法清晰定义分区范围的大型数据表。这种分区方式通过计算分区键的哈希值来决定数据存储在哪个分区,以此达到数据分散和负载均衡的目的。Hash分区...
Hash_1.0.4.exe检验文件Hash,
在网络安全领域,数据的完整性与安全性至关重要。为了保护数据不被篡改,开发者通常会使用哈希消息认证码(HMAC)进行签名加密。HMAC 是一种基于密钥的哈希函数,它可以验证数据的完整性和来源。在 ASP 和 PHP 环境...
Oracle 和 SQL Server 是两种广泛应用的关系型数据库管理系统(RDBMS),它们在许多方面都有相似之处,但也有明显的差异。在数据库管理员和开发人员的工作中,理解这些差异是至关重要的,以便选择适合特定需求的...
在描述中提到的MD5(Message-Digest Algorithm 5)是一种广泛应用的哈希函数,它能将任意大小的文件转化为128位的哈希值,通常以32位的16进制数字形式呈现,用于验证文件的完整性。 MD5的优势在于它的单向性:从...
WHERE a.sql_id = b.sql_id AND a.user_id = c.user_id ORDER BY CNT desc ) t, v$session s WHERE t.sql_id = s.sql_id(+); ``` 这个查询返回了过去30分钟内最消耗资源的SQL语句及其执行的用户、会话ID、机器...