powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хэширование
25 сообщений из 82, страница 1 из 4
Хэширование
    #37080054
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически Хэширование при соединении таблиц и группировки имеет несколько приемуществ:
хэш-функция
1. получая на вход значение ключа, на выходе дает адрес строки или указателя на строку
2. вырабатывает меньшее значение
3. равномерно распределеяет данные

Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть может конкретный привести пример такой функции?
...
Рейтинг: 0 / 0
Хэширование
    #37080194
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.01.2011 16:45, exploys wrote:

> хэш-функция
> 1. получая на вход значение ключа, на выходе дает адрес строки или указателя на
> строку
> 2. вырабатывает меньшее значение
> 3. равномерно распределеяет данные
>
> Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть
> может конкретный привести пример такой функции?

Да. Например, сумма кодов всех символов, составляющих строку.


Что такое
> 2. вырабатывает меньшее значение
> 3. равномерно распределеяет данные

я вот лично не понял.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37080313
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 26.01.2011 16:45, exploys wrote:

> хэш-функция
> 1. получая на вход значение ключа, на выходе дает адрес строки или указателя на
> строку
> 2. вырабатывает меньшее значение
> 3. равномерно распределеяет данные
>
> Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть
> может конкретный привести пример такой функции?

Да. Например, сумма кодов всех символов, составляющих строку.

Получаться какие-то непонятные разряженные значения. И как с помощью них обратиться к нужным участкам памяти? И вообще какой смысл у такой хэш-функции и чем она лучше чем просто значение ключа?
Я так понимаю, что хэш-функция y=f(x),
где
x - ключ по которому идет хэширование
y - адрес в памяти, где расположена строка или указатель на строку

MasterZivЧто такое
> 2. вырабатывает меньшее значение
> 3. равномерно распределеяет данные

я вот лично не понял.

2. хэширование - это свёртка, т.е. результат хэгирования может занимать меньший обхем памяти, но с возникновением коллизий
...
Рейтинг: 0 / 0
Хэширование
    #37080329
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysИ как с помощью них обратиться к нужным участкам памяти? И вообще какой смысл у такой хэш-функцииЭто вы уже про Хеш-таблицу говорите, насколько я понимаю.
...
Рейтинг: 0 / 0
Хэширование
    #37080363
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайдем с другого конца, в чем практическая польза значения хэш-функции от ключа вместо значения ключа при соединение хэшированием и группировках?
...
Рейтинг: 0 / 0
Хэширование
    #37080371
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploys,

Считайте, что это такой метод разбить множество значений на группы, для которых верно следующее:
- Если значения попали в разные группы, то они точно не равны.
- Если значения попали в одну группу, то они могут быть равно.
В итоге, чтобы найти соответствие (по условию "равно") очередному значению из какого-то списка, достаточно просматривать только ту же хэш-группу этого же (в случае GROUP BY) или другого (в случае JOIN) списка, а не весь список от начала до конца.
...
Рейтинг: 0 / 0
Хэширование
    #37080378
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftexploys,

Считайте, что это такой метод разбить множество значений на группы, для которых верно следующее:
- Если значения попали в разные группы, то они точно не равны.
- Если значения попали в одну группу, то они могут быть равно.
В итоге, чтобы найти соответствие (по условию "равно") очередному значению из какого-то списка, достаточно просматривать только ту же хэш-группу этого же (в случае GROUP BY) или другого (в случае JOIN) списка, а не весь список от начала до конца.
Спасибо.
Т.е. по простому двухуровневое дерево? И на этом польза от хэш-функция заканчивается?
...
Рейтинг: 0 / 0
Хэширование
    #37080395
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysИ на этом польза от хэш-функция заканчивается?Нет, конечно. Я отвечал на конкретный вопрос про "при соединение хэшированием и группировках".
Почитайте хотя бы в википедии - Хеширование .
...
Рейтинг: 0 / 0
Хэширование
    #37080408
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.01.2011 18:21, exploys wrote:
> Получаться какие-то непонятные разряженные значения. И как с помощью них
> обратиться к нужным участкам памяти? И вообще какой смысл у такой хэш-функции и
> чем она лучше чем просто значение ключа?
> Я так понимаю, что хэш-функция y=f(x),
> где
> x - ключ по которому идет хэширование
> y - адрес в памяти, где расположена строка или указатель на строку

Ну возьми ещё mod по размеру хэш-таблицы, и получишь индекс в хэш-таблице.
Вообще, до тех пор пока тебе не надо писать хэш-таблицу самому (очень редко
бывает) -- ты лучше не парься. Тебе надо только знать, что оно по ключу,
и оно O(1). Всё, собственно. А если ты БД программируеш, то вообще
только что это очень быстро.

>
> 2. хэширование - это свёртка, т.е. результат хэгирования может занимать меньший
> обхем памяти, но с возникновением коллизий

Это в частном случае только она может быть свёрткой.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37080409
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.01.2011 18:53, exploys wrote:

> Зайдем с другого конца, в чем практическая польза значения хэш-функции от ключа
> вместо значения ключа при соединение хэшированием и группировках?

Говорю, не парься. Это -- способ быстрого поиска данных по ключу.
Как ищет -- уже неважно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37080412
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.01.2011 19:06, exploys wrote:

> Т.е. по простому двухуровневое дерево? И на этом польза от хэш-функция
> заканчивается?

Было бы двухуровневое дерево, был бы O(logN). А хэширование даёт
O(1). Вот в том и польза.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37080424
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 26.01.2011 19:06, exploys wrote:

> Т.е. по простому двухуровневое дерево? И на этом польза от хэш-функция
> заканчивается?

Было бы двухуровневое дерево, был бы O(logN). А хэширование даёт
O(1). Вот в том и польза.

Так вот и я о чем. Что группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева. Но O(1) - может быть в случае отображения через хэш-функцию непосредственно адресов строк в памяти. О чем я писал в самом начале.
Возвращаемся к первоначальному вопросу, кто-нибуть знает пример такой функции?
...
Рейтинг: 0 / 0
Хэширование
    #37081065
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.01.2011 19:46, exploys wrote:

> Возвращаемся к первоначальному вопросу, кто-нибуть знает пример такой функции?

Тебе зачем надо-то ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37081153
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysТеоретически Хэширование при соединении таблиц и группировки имеет несколько приемуществ:
хэш-функция
1. получая на вход значение ключа, на выходе дает адрес строки или указателя на строку
2. вырабатывает меньшее значение
3. равномерно распределеяет данные

Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть может конкретный привести пример такой функции?
Раньше я думал, что если соединение на равенство, и одна табла из соединяемых малая, то эту малую таблу скачивать в память моно один раз, и Хэширование сократит число циклов, за счет того, что значение сравнивается по значению только с одной группой записей, с которой совпал Хэш ключ.
Допустим, эта малая табла разбита на 16 таких групп. Например, там 16 000 записей. Значение из второй таблы по ключу сравнивается с 15, и по конкретному значению только с той в которой совпал ключ. Т.е. вместо 16 000 цикл соствил 1000 + 15.
А поскольку вся табла первая в памяти, то на этом все и исчерпывается.

Но если первая табла не вся в памяти, то потребовалось бы считывать повторно блоки и из второй таблы, и хэширование могло потерять свои преимущества так как повторное чтение, могло бы, убить все это премущество.
Если в условии соединения неравенства, то это преимущество не работает.
...
Рейтинг: 0 / 0
Хэширование
    #37083111
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 26.01.2011 19:46, exploys wrote:

> Возвращаемся к первоначальному вопросу, кто-нибуть знает пример такой функции?

Тебе зачем надо-то ?

Просто интересно. Неужели никто не знает?

vadiminfo,
Яж писал, про то что если ведомая таблица не помещается в памяти
exploysЧто группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева.
...
Рейтинг: 0 / 0
Хэширование
    #37083278
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo,
Яж писал, про то что если ведомая таблица не помещается в памяти
exploysЧто группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева. [/quot]
Ну я писал, что думал так ранее. Т.е. если а малая таблица ("ведомая" ли "ведущая" ли ) не помещается в памяти, то преимущества хэш при соединении становятся менее очевидными. Т.е., возможно, нужно уже смотреть и другие алгоритмы с целью повышения производительности и сравнивать.
Т.е. выразил сомнения в преимуществах хэширования для СУБД у которых данные БД на дисках.


У Вашей СУБД есть отимизатор? Ну посмотрите планы запросов для разных ситуаций.
...
Рейтинг: 0 / 0
Хэширование
    #37083793
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 28.01.2011 0:12, exploys wrote:

> Просто интересно. Неужели никто не знает?

Ну я знаю. Я тебе сказал в теме пример, чем он тебе не хорош --
я не понимаю. Для удовлетворения любопытсва -- вполне себе.

[src C]
[/src]
> Что группировка по хэш значениям это второстепенная задача. Когда хэш-таблица
> становиться *слишком большой*

Хэш-таблица НИКОГДА не становится слишком большой. Она имеет всегда
фиксированный объём.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37083808
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 28.01.2011 11:25, MasterZiv wrote:

Блин, забыл запостить пример хэш-функции.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
unsigned hashCode( const std::string &key, const unsigned hashtable_size )
{
	unsigned hash =  0 ;
	for ( unsigned i =  0 ; i < key.size(); ++i )
	{
		hash += unsigned(key[i]);
	}
	
	return hash % hashtable_size;
}

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37084322
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, vadiminfo,

MS SQL BOL
авторРекурсия хэша возникает, когда входные данные не помещаются в доступную память, что приводит к разбиению их на несколько отдельно обрабатываемых секций. Если какая-либо из этих секций все же не помещается в доступную память, она разбивается на подсекции, которые также обрабатываются отдельно. Процесс разбиения продолжается, либо пока все секции не будут помещаться в доступную память, либо пока не будет достигнут максимальный уровень рекурсии


А за функцию спасибо, как вариант.
...
Рейтинг: 0 / 0
Хэширование
    #37084438
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysMasterZiv, vadiminfo,

MS SQL BOL
авторРекурсия хэша возникает, когда входные данные не помещаются в доступную память, что приводит к разбиению их на несколько отдельно обрабатываемых секций. Если какая-либо из этих секций все же не помещается в доступную память, она разбивается на подсекции, которые также обрабатываются отдельно. Процесс разбиения продолжается, либо пока все секции не будут помещаться в доступную память, либо пока не будет достигнут максимальный уровень рекурсии


Ну, хорошо. Я же не говорю, что хэш не возможен. Я же предполагаю, что утрачиваются преимущества, возможно, драмматично в количестве считываний блоков. Ведь теперь блоки второй - большой таблы придется считывать с дисков по новой? Ить их нельзя было сравнить с теми что были не в памяти? Либо держать их и малые многократно считывать? Могут оказаться алгоритмы, которые обеспечат меньшее кол-во считываний. А количество считываний как правило самое критичное для СУБД такого типа хранения данных. Иначе бы в планах запросов мы вседа бы видели хэш - алгоритмы. "Но этого не происходит"(C)
...
Рейтинг: 0 / 0
Хэширование
    #37085615
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo Могут оказаться алгоритмы, которые обеспечат меньшее кол-во считываний.
Это например какие алгоритмы?
исключая:
MERGE - только когда обе таблицы проиндексированы
NESTED LOOP - только когда одна из таблиц крайне мала, а большая проиндексирована
К слову в MS SQL только эти 3 алгоритма. Так какие же ещё ценные алгоритмы соединений они упустили?
...
Рейтинг: 0 / 0
Хэширование
    #37085648
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 28.01.2011 11:25, MasterZiv wrote:

Блин, забыл запостить пример хэш-функции.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
unsigned hashCode( const std::string &key, const unsigned hashtable_size )
{
	unsigned hash =  0 ;
	for ( unsigned i =  0 ; i < key.size(); ++i )
	{
		hash += unsigned(key[i]);
	}
	
	return hash % hashtable_size;
}


Вообще использоваться я так понимаю примерно так должно?

Код: plaintext
1.
2.
3.
4.
void *getHashAdr( void **pHashTable, const std::string &key, const unsigned hashtable_size )
{
	return pHashTable[hashCode(key, hashtable_size)];
}

9.2.2. Хэширование
авторВ самом простом, классическом случае, свертка ключа используется как адрес в таблице, содержащей ключи и записи. Основным требованием к хэш-функции является равномерное распределение значение свертки .
...
Рейтинг: 0 / 0
Хэширование
    #37086327
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysvadiminfo Могут оказаться алгоритмы, которые обеспечат меньшее кол-во считываний.
Это например какие алгоритмы?
исключая:
MERGE - только когда обе таблицы проиндексированы
NESTED LOOP - только когда одна из таблиц крайне мала, а большая проиндексирована
К слову в MS SQL только эти 3 алгоритма. Так какие же ещё ценные алгоритмы соединений они упустили?

Ну, Ви там в MS SQL если хотите, то исключайте SORT MERGE и NESTED LOOP.
А в Оракле, думау, все алгоритмы, включая перечисленные Вами, и так чрезмерно Вами ценимый алгоритм хэшированием (ить с ним надо сравнивать по Вашему только "ценные алгоритмы"), и в дополнение Cartesian еще какое-то время послужат.
Ну, по крайней мере, до тех пока Вы не откроете, что даже приведенные Вами случаи? када такие алгоритмы имеют преимущество, более не представляют интереса для практики.

А ить в соединении где в условиях могут быть неравенства.
А есть соедиения, где надо вернуть только первую строку (Например в SQL выражениях типа EXISTS).

Кроме того, если таблы малы? и их можно отсортировать в ОП, то SORT MERGE посему не проканает?

Наконец, кроме этого соединения в запросе могут быть другие операции, для которых все равно нужна сортировка.

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

И как и раньше, думау, что есль соединяемые таблы очень большие, то хэширование, возможно, с каког-то момента их увеличения, возможно, не буит иметь преимуществ перед не "ценным" NESTED LOOP, а если отсортировано то SORT MERGE. На крайняк все окажутся не приемлемыми, и придется как-то по другому разруливать.

Понятие "ценные алгоритмы" не совсем ясно, так как не сталкивался с делением алгоритмов, используемых при оптимизации запросов по ценностной шкале. Потому, плиз, не нуно мне ниче подобного приписыть. Я ни про какие ценные и не ценные не говорил. Говорил про другие.
...
Рейтинг: 0 / 0
Хэширование
    #37086428
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo, какой-то бессвязный набор букв.

Мы рассматриваем Хэширование. Соединение хэшированием применяется когда нету индексов. Вы высказали мнение, что если обе таблицы не поместятся в памяти то хэширование не оптимально.
Т.е. в этом случае, когда нету индексов и обе таблицы не помещаются в памяти по вашему оптимальнее будет использовать SORT MERGE и NESTED LOOP?
А уж как вы решили соединение хэшированием заменить картезианом вообще непонятно.
...
Рейтинг: 0 / 0
Хэширование
    #37086495
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysvadiminfo, какой-то бессвязный набор букв.

Мы рассматриваем Хэширование. Соединение хэшированием применяется когда нету индексов. Вы высказали мнение, что если обе таблицы не поместятся в памяти то хэширование не оптимально.
Т.е. в этом случае, когда нету индексов и обе таблицы не помещаются в памяти по вашему оптимальнее будет использовать SORT MERGE и NESTED LOOP?
А уж как вы решили соединение хэшированием заменить картезианом вообще непонятно.
А когда есть индексы "Соединение хэшированием" не применимо? А планы в Оракле с хэшированием для индексированных попадаются.

Я вроде высказал, что может терять преимущества. Т.е. может оказаться не оптимальным, а не оказывается обязательно не отимальным. Это даже не означет в общем случае что, кто-то луче, Это означет, что ОНО не луче. Например, все плохи. Вы и в правду, как-то не совсем удачно связываете буквы.

Уточню что хотел сказать тада есче раз:
Я хотел сказать, что признау, что хэширование саммый эффективный способ при относительно небольшом размере меньшей таблы. Особенно када она помещается в памяти. Не зависимо ни от наличия или отсутсвия индексов или чего либо еще.
Но чем больше меньшая табла, тем более эти преимущества более утрачиваются с момента как она не помещается в памяти. Эта эффективность тает.
И не исключаю, что SORT MERGE и NESTED LOOP могут быть как минимум не хуже.



Про "нету индексов" я ниче не говорил. С какой стати? Не знау зачем их не создавать, если речь об оптимизации, и они могут помочь.

Не нуно, плиз, приписывать мне ниче такого.

Если бы Вы нашли бы связи в буквах, то типа я там приводил и др случаи када хэширование не канает.
...
Рейтинг: 0 / 0
25 сообщений из 82, страница 1 из 4
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хэширование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]