I am working with an Oracle database and I need to be able to partition the data in a table. I understand that Rracle has an ora_hash function that can partition the data i
Jon Heller's answer has some more details, so go upvote his answer. Since this is the accepted answer still, I'll inline part of his response:
ORA_HASH
is definitely deterministic for data types that can be used for partitioning, such asNUMBER
,VARCHAR
,DATE
, etc.But
ORA_HASH
is not deterministic for at least some of the other data types, such asCLOB
.
ORA_HASH
is definitely deterministic for data types that can be used for partitioning, such as NUMBER, VARCHAR, DATE, etc.
But ORA_HASH
is not deterministic for at least some of the other data types, such as CLOB.
My answer is based on this Jonathan Lewis article about ORA_HASH
.
Jonathan Lewis doesn't explicitly say they are deterministic, but he does mention that ORA_HASH
"seems to be the function used internally – with a zero seed – to determine which partition a row belongs to in a hash partitioned table". And if it's used for hash partitioning then it must be deterministic, or else partition-wise joins wouldn't work.
To show that ORA_HASH
can be non-deterministic for some data types, run the below query. It's from a comment in the same article:
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;
Surprisingly, this same issues happens with dbms_sqlhash.gethash
.