ORA_HASH
ist definitiv deterministisch für Datentypen, die zur Partitionierung verwendet werden können, wie NUMBER, VARCHAR, DATE usw.
Aber ORA_HASH
ist nicht deterministisch für zumindest einige der anderen Datentypen, wie CLOB.
Meine Antwort basiert auf diesem
Artikel von Jonathan Lewis über ORA_HASH
.
Jonathan Lewis sagt nicht ausdrücklich, dass sie deterministisch sind, aber er erwähnt diesen ORA_HASH
"scheint die Funktion zu sein, die intern verwendet wird - mit einem Null-Startwert - um zu bestimmen, zu welcher Partition eine Zeile in einer Hash-partitionierten Tabelle gehört". Und wenn es für die Hash-Partitionierung verwendet wird, muss es deterministisch sein, sonst würden partitionsweise Joins nicht funktionieren.
Um diesen ORA_HASH
anzuzeigen für einige Datentypen nicht deterministisch sein kann, führen Sie die folgende Abfrage aus. Es stammt aus einem Kommentar im selben 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;
Überraschenderweise treten dieselben Probleme mit dbms_sqlhash.gethash
auf .