Какой алгоритм используется в хэш-разделе, чтобы разделить данные на разделы одинакового размера, прежде чем просматривать какие-либо данные - PullRequest
1 голос
/ 30 июня 2019

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

Но как такой алгоритм может работать, прежде чем увидеть фактические данные? Разве нельзя было бы получить набор хеш-разделов, где 99% данных попадает в один из разделов, а оставшийся 1% делится на оставшиеся n разделов?

1 Ответ

3 голосов
/ 30 июня 2019

Да, это теоретически возможно.Но алгоритмы хеширования существенно рандомизируют поступающие данные.Правила статистики тогда подразумевают, что разделы будут близки по размеру.

Если у вас большие данные, то различия даже в размере всего 1% в размере разделов становятся совершенно маловероятными - при условии, что исходные данныеимеет уникальные значения.

Однако, если исходные данные искажены, то и получающиеся ячейки также могут быть искажены.Например, рассмотрим, есть ли у вас 100 значений, 0-9 встречаются один раз, а 10 встречаются 90 раз.Все 90 строк со значением 10 войдут в один и тот же раздел, поэтому результирующие корзины будут разбалансированы.

Oracle использует функцию ORA_HASH для принятия решения, какой хеш-раздел использовать.Точный алгоритм этой функции публично не известен.Но в руководстве обсуждаются некоторые свойства этого алгоритма;ORA_HASH лучше всего работает с уникальными данными, а когда количество сегментов равно степени 2. Если эти условия не выполняются, некоторые разделы могут быть значительно больше других.

...