ORA_HASH
определенно является детерминированным для типов данных, которые можно использовать для разделения, таких как NUMBER, VARCHAR, DATE и т. Д.
Но ORA_HASH
является , а не детерминированным по крайней мере для некоторых других типов данных, таких как CLOB.
Мой ответ основан на этой статье Джонатана Льюиса о ORA_HASH
.
Джонатан Льюис не говорит явно, что они являются детерминированными, но он упоминает, что ORA_HASH
«кажется, что это функция, используемая внутри - с нулевым начальным числом - для определения того, к какому разделу относится строка в хэш-таблице с разделами» , И если он используется для разбиения хэша, то он должен быть детерминированным, иначе соединения с разбиением не будут работать.
Чтобы показать, что ORA_HASH
может быть недетерминированным для некоторых типов данных, выполните следующий запрос. Это из комментария в той же статье:
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;
Удивительно, но такие же проблемы случаются с dbms_sqlhash.gethash
.