`
juji1010
  • 浏览: 117086 次
社区版块
存档分类
最新评论

Oracle SQLID 与 Hash_value 之间的相互转化

 
阅读更多
一、什么是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

分享到:
评论

相关推荐

    查詢高消耗CPU的pid的SQL

    查詢高消耗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

    定位Oracle中的TOP_SQL

    该视图提供了当前会话的执行信息,可以根据 SQL_ID 和 EXECUTIONS 字段来排序,找出当前正在执行的 TOP_SQL。 ### 方法五:通过 PLAN_HASH_VALUE 可以通过 PLAN_HASH_VALUE 来找到 TOP_SQL 的执行计划。该值可以与...

    oracle_v$session_v$session_wait用途详解

    - 使用 `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_1.0.4_0523.exe以及HashModifier.exe)

    Hash函数是一种加密算法,它将任意长度的输入(也叫做预映射或消息)转化为固定长度的输出,这个输出就是哈希值。常见的Hash算法有MD5(Message-Digest Algorithm 5)、SHA-1(Secure Hash Algorithm 1)、SHA-256等...

    oracle消耗资源的sql查询语句记录

    ### Oracle消耗资源的SQL查询语句记录 在Oracle数据库管理中,监控和优化SQL查询是确保系统性能稳定的关键环节之一。对于那些消耗大量资源的SQL语句进行记录和分析可以帮助DBA快速定位问题并采取相应的优化措施。...

    c++中hash_table以及std::map应用案例

    代码重点是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_...

    oracle_V$SQLAREA_.rar_oracle_oracle V$sqlarea

    3. **解析次数**:`PARSING_USER_ID` 和 `PARSING_SCHEMA_ID` 分别记录了SQL语句的解析用户和模式,而`COUNT(*)` 列则显示了SQL语句被解析的总次数。 4. **执行信息**:`EXECUTIONS` 列显示SQL语句的执行次数,`...

    hash_map的详解

    ### hash_map详解 #### 0. 为什么需要hash_map? 在软件开发中,经常会遇到需要高效存储和查找键值对(key-value)的情况。例如,在管理人物名称及其相关信息时,我们希望能够快速地添加、查找和更新数据。传统的...

    gen_lex_hash_pc

    `gen_lex_hash`的运行结果会生成`lex_hash.h`头文件,这个文件包含了所有可能的SQL关键字和标识符的哈希值,确保MySQL能正确解析和理解输入的SQL指令。 对于PC平台,由于硬件资源相对丰富,但可能与MySQL服务器的...

    oracle 查看当前会话执行的sql语句

    WHERE AO.OBJECT_ID = LO.OBJECT_ID AND LO.SESSION_ID = SESS.SID; ``` 这个查询提供了锁定对象的基本信息,包括锁定模式等。 #### 5. 查询特定会话执行的SQL语句地址 如果想要更精确地定位某个会话正在执行的...

    Oracle常用SQL查询语句

    AND sql_hash_value = hash_value; ``` **功能说明:** 此查询用于监控正在长时间运行的SQL语句,显示了执行这些语句的用户、会话ID、操作名称、进度、剩余时间以及SQL文本。 ### 11. 查询分区信息 ```sql ...

    Oracle SQL 优化与调优技术详解-附录:SQL提示

    这里提供的知识是基于黄玮编写的《Oracle高性能SQL引擎剖析:Oracle SQL优化与调优技术详解》一书的内容,以及上述文档提供的相关知识点。在实际应用中,可以参考这些内容来优化Oracle数据库中的SQL查询。同时,为了...

    hash_map的简单应用

    hash_map

    oracle分区表之hash分区表的使用及扩展

    Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于处理无法清晰定义分区范围的大型数据表。这种分区方式通过计算分区键的哈希值来决定数据存储在哪个分区,以此达到数据分散和负载均衡的目的。Hash分区...

    Hash_1.0.4.exe

    Hash_1.0.4.exe检验文件Hash,

    asp版hmac_sha1加密方式,真正和PHP的hash_hmac加密结果完全一样。支持中文utf-8编码

    在网络安全领域,数据的完整性与安全性至关重要。为了保护数据不被篡改,开发者通常会使用哈希消息认证码(HMAC)进行签名加密。HMAC 是一种基于密钥的哈希函数,它可以验证数据的完整性和来源。在 ASP 和 PHP 环境...

    Oracle_SQL_Server.rar_oracle

    Oracle 和 SQL Server 是两种广泛应用的关系型数据库管理系统(RDBMS),它们在许多方面都有相似之处,但也有明显的差异。在数据库管理员和开发人员的工作中,理解这些差异是至关重要的,以便选择适合特定需求的...

    Hash_1.0.4_0523.zip

    在描述中提到的MD5(Message-Digest Algorithm 5)是一种广泛应用的哈希函数,它能将任意大小的文件转化为128位的哈希值,通常以32位的16进制数字形式呈现,用于验证文件的完整性。 MD5的优势在于它的单向性:从...

    oracle常用性能分析语句执行情况等语句总结

    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、机器...

Global site tag (gtag.js) - Google Analytics