Files
oracle/vg/sqlid_to_hashvalue.sql
2026-03-12 21:23:47 +01:00

34 lines
1.2 KiB
MySQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
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'))
/