Является ли 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 будет детерминированным. См. документацию.
Ответы
Ответ 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
.