ORA_HASH
är definitivt deterministiskt för datatyper som kan användas för partitionering, såsom NUMBER, VARCHAR, DATE, etc.
Men ORA_HASH
är inte deterministisk för åtminstone några av de andra datatyperna, såsom CLOB.
Mitt svar är baserat på detta
Jonathan Lewis-artikel om ORA_HASH
.
Jonathan Lewis säger inte uttryckligen att de är deterministiska, men han nämner att ORA_HASH
"verkar vara funktionen som används internt – med nollfrö – för att bestämma vilken partition en rad tillhör i en hashpartitionerad tabell". Och om den används för hash-partitionering måste den vara deterministisk, annars skulle partitionsmässiga joins inte fungera.
För att visa att ORA_HASH
kan vara icke-deterministisk för vissa datatyper, kör nedanstående fråga. Det är från en kommentar i samma artikel:
with src as (select to_clob('42') val from dual connect by level<=5)
select val,ora_hash(val,7) from src order by 2;
Överraskande nog händer samma problem med dbms_sqlhash.gethash
.