Является ли ora_hash детерминированным? - программирование
Подтвердить что ты не робот

Является ли ora_hash детерминированным?

Я работаю с базой данных Oracle, и мне нужно иметь возможность разбивать данные в таблице. Я понимаю, что у Rracle есть функция ora_hash, которая может разбивать данные на ведра. Является ли функция ora_hash детерминированной?

В моей программе я буду делать несколько разных запросов к базе данных с каждым запросом, запрашивающим другой номер ведра.

Например, в одном запросе я могу запросить первые два ведра:

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (0,1);

В следующем запросе я могу запросить 2-е и 3-е ведро:

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (1,2);

В приведенном выше примере будет ли ora_hash всегда разделять таблицу на те же 10 ковшей? Предположим, что данные в таблицах не изменились. Будет ли второе ведро (ведро 1) идентичным в обоих запросах?

Существует документация, в которой предполагается, что начальное значение позволяет oracle возвращать разные результаты для одного и того же набора данных. Поэтому я предполагаю, что если я не буду использовать начальное значение, то ora_hash будет детерминированным. См. документацию.

4b9b3361

Ответ 1

Ответ Джона Хеллера содержит более подробную информацию, поэтому откройте ответ. Поскольку это уже принятый ответ, я добавлю часть его ответа:

ORA_HASH определенно детерминирован для типов данных, которые могут использоваться для разбиения на разделы, такие как NUMBER, VARCHAR, DATE и т.д.

Но ORA_HASH не является детерминированным по крайней мере для некоторых других типов данных, таких как CLOB.

Ответ 2

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.