Является ли 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 будет детерминированным. Смотрите документацию.
2 ответа
В ответе Джона Хеллера есть еще несколько деталей, так что поднимите его. Поскольку это все еще принятый ответ, я приведу часть его ответа:
ORA_HASH
является определенно детерминированным для типов данных, которые могут использоваться для разделения, таких какNUMBER
,VARCHAR
,DATE
, так далее.Но
ORA_HASH
не является детерминированным по крайней мере для некоторых других типов данных, таких какCLOB
,
ORA_HASH
определенно является детерминированным для типов данных, которые могут использоваться для разделения, таких как NUMBER, VARCHAR, DATE и т. д.
Но ORA_HASH
не является детерминированным по крайней мере для некоторых других типов данных, таких как CLOB.
Мой ответ основан на этой статье Джонатана Льюиса о ORA_HASH
,
Джонатан Льюис не говорит явно, что они детерминированы, но он упоминает, что ORA_HASH
msgs tr "кажется, что это функция, используемая внутри - с нулевым начальным числом - для определения того, к какому разделу относится строка в хэш-таблице с разделами". И если он используется для разбиения хэша, то он должен быть детерминированным, иначе соединения с разбиением не будут работать.
Чтобы показать что 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
,