ORA_HASH
jest zdecydowanie deterministyczny dla typów danych, które mogą być używane do partycjonowania, takich jak NUMBER, VARCHAR, DATE itp.
Ale ORA_HASH
jest nie deterministyczny dla przynajmniej niektórych innych typów danych, takich jak CLOB.
Moja odpowiedź opiera się na tym
Artykuł Jonathana Lewisa o ORA_HASH
.
Jonathan Lewis nie mówi wyraźnie, że są deterministyczne, ale wspomina, że ORA_HASH
„wydaje się być funkcją używaną wewnętrznie – z zerowym ziarnem – w celu określenia, do której partycji należy wiersz w tabeli partycjonowanej z haszowaniem”. A jeśli jest używany do partycjonowania mieszającego, musi być deterministyczny, w przeciwnym razie łączenie partycji nie zadziała.
Aby pokazać, że ORA_HASH
może być niedeterministyczny dla niektórych typów danych, uruchom poniższe zapytanie. Pochodzi z komentarza w tym samym artykule:
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;
Co zaskakujące, te same problemy występują w przypadku dbms_sqlhash.gethash
.