Oracle
 sql >> Database >  >> RDS >> Oracle

ora_hash è deterministico?

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 .