Files
oracle/vg/sqlid_to_hashvalue.sql

34 lines
1.2 KiB
MySQL
Raw Normal View History

2026-03-12 21:23:47 +01:00
/*
Description - Converts SQLID into HASH_VALUE
Input Parameter - SQL_ID
Source - http://blog.tanelpoder.com/2009/02/22/sql_id-is-just-a-fancy-representation-of-hash-value/
Basically all it does is takes the SQL ID, interpret it as a 13 character base-32 encoded number and then take only the lowest 4 bytes worth of information (4 bytes in base-256) out of that number and thats the hash value.
Actually, since 10g the full story goes like this:
1) Oracle hashes the library cache object name with MD5, producing a 128 bit hash value
2) Oracle takes last 64 bits of the MD5 hash and this will be the SQL_ID (but its shown in base-32 for brevity rather than in hex or as a regular number)
3) Oracle takes last 32 bits of the MD5 hash and this will be the hash value (as seen in v$sql.hash_value).
In 10gR1+, you can do this:
SQL> select dbms_utility.SQLID_TO_SQLHASH(btxdhy7gkbwjk) hash_value FROM DUAL;
HASH_VALUE
-
3743806002
*/
select
lower(trim('&&1')) sql_id
, trunc(mod(sum((instr('0123456789abcdfghjkmnpqrstuvwxyz',substr(lower(trim('&&1')),level,1))-1)
*power(32,length(trim('&&1'))-level)),power(2,32))) hash_value
from
dual
connect by
level <= length(trim('&&1'))
/