ORA_HASH
è decisamente deterministico per i tipi di dati che possono essere utilizzati per il partizionamento, come NUMBER, VARCHAR, DATE, ecc.
Ma ORA_HASH
è non deterministico per almeno alcuni degli altri tipi di dati, come CLOB.
La mia risposta si basa su questo
Articolo di Jonathan Lewis su ORA_HASH
.
Jonathan Lewis non dice esplicitamente che sono deterministici, ma menziona che ORA_HASH
"sembra essere la funzione utilizzata internamente - con un seme zero - per determinare a quale partizione appartiene una riga in una tabella partizionata hash". E se viene utilizzato per il partizionamento hash, deve essere deterministico, altrimenti i join partizionati non funzionerebbero.
Per mostrare quel ORA_HASH
può essere non deterministico per alcuni tipi di dati, eseguire la query seguente. Viene da un commento nello stesso articolo:
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;
Sorprendentemente, lo stesso problema si verifica con dbms_sqlhash.gethash
.