Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ist ora_hash deterministisch?

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 .