powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хэширование
82 сообщений из 82, показаны все 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
Хэширование
    #37087327
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 29.01.2011 1:25, exploys wrote:
> Вообще использоваться я так понимаю примерно так должно?
>
> void *getHashAdr(void **pHashTable,const std::string&key,const unsigned hashtable_size )
> {
> return pHashTable[hashCode(key, hashtable_size)];
> }

Не совсем.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
struct HashTableElement
{
   std::string& key;
   void *data;
};


HashTableElement* getHashAdr( HashTableElement* pHashTable[],
                               const  std::string&key,
                               const unsigned  hashtable_size
                             )
{
   unsigned hash = hashCode( key, hashtable_size );
   unsigned i, n;
   for( i = hash, n = hashtable_size; n >  0 ; i = (i +  1 ) % hashtable_size, ++n )
   {
     if( pHashTable[i]->key == key )
       return pHashTable[i];
     else if( pHashTable[i]->key.empty() )
       return pHashTable[i]; // можно NULL;
   }
   throw hash_table_overflow_exception();
}


(Приводится один из самых тупейших алгоритмов обработки переполнения хэша.)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37087335
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 29.01.2011 22:41, exploys wrote:

> Мы рассматриваем Хэширование. Соединение хэшированием применяется когда нету
> индексов. Вы высказали мнение, что если обе таблицы не поместятся в памяти то
> хэширование не оптимально.

Родной мой, если для JOIN-а нет индекса, то там ВСЁ ЧТО УГОДНО будет ЛУЧШЕ,
чем ничего. В смысле, чем O(N*M) ( N,M - размеры таблиц в JOIN-е).
Что тут думать ? Оно будет хуже только при очень малых N,M, типа 1-2-3.

Зачем вообще думать о JOIN-ах без индексов -- не понимаю. JOIN без индекса --
надо уволнять программиста, который его (и/или БД) написал.

> Т.е. в этом случае, когда нету индексов и обе таблицы не помещаются в памяти по
> вашему оптимальнее будет использовать SORT MERGE и NESTED LOOP?

1) как правило СУБД никогда не завязываются на содержимое кэша при составлении
планов. Кэш потому что может быть и почищен ко времени выполнения запроса.

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

> Мы рассматриваем Хэширование. Соединение хэшированием применяется когда нету
> индексов. Вы высказали мнение, что если обе таблицы не поместятся в памяти то
> хэширование не оптимально.

Родной мой, если для JOIN-а нет индекса, то там ВСЁ ЧТО УГОДНО будет ЛУЧШЕ,
чем ничего. В смысле, чем O(N*M) ( N,M - размеры таблиц в JOIN-е).
Что тут думать ? Оно будет хуже только при очень малых N,M, типа 1-2-3.

Зачем вообще думать о JOIN-ах без индексов -- не понимаю. JOIN без индекса --
надо уволнять программиста, который его (и/или БД) написал.

Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе. Кроме того индексы могут быть, но не всегда могут применяться, к примеру при соединении трех больших таблиц. И к чему весь этот бред про более оптимальные алгоритмы?

Соединение хэшированием выполняется когда нету индексов по соединяемым полям по обоим таблицам, либо нет по одной из них, либо не могут применяться и обе таблицы имеют относительно большие размеры. Чем больше размеры обеих таблиц, тем более преимущественно использование HASH JOIN.

Как вы обойдетесь без HASH JOIN, когда 3 таблицы имеют размеры от 1000000 строк?
Код: plaintext
1.
2.
SELECT *
FROM A INNER JOIN B ON A.ID = B.A_ID
INNER JOIN C ON B.ID = C.B_ID
По таблице B будет использоваться либо индекс по B.A_ID либо B.ID.

MasterZiv> Т.е. в этом случае, когда нету индексов и обе таблицы не помещаются в памяти по
> вашему оптимальнее будет использовать SORT MERGE и NESTED LOOP?

1) как правило СУБД никогда не завязываются на содержимое кэша при составлении
планов. Кэш потому что может быть и почищен ко времени выполнения запроса.

Кэш тут вообще не причем.
Таблицы не помещается в памяти - означает, что они не помещаются в памяти. Т.е. их размер больше чем свободное RAM. СУБД оценивает количество необходимых IO включая запись в Temp.


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

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


Так или иначе в Оракле нпазывается SORT MERGE имеет отношение именно к соединениям. Конечно, у Оракла юзается слов MERGE, паример для команды DML, в которой и INSERT и UPDATE. А также и в оптимизатрое есть трасформация представлений View Merging.
Но алгоритм доступа к данным тока SORT MERGE. Никакой сортировка слиянием, "и никакого отношения к соединениям не имеет" там нет пока есче.

Ну Вы используйте NESTED LOOP када хотите, а я уверенно када обе малы, либо условия соединения таковы, что никакие другие алогоритмы не уместны. В остальных случаях бум посматрет.


Думаете кто первый сказал "Учите мат часть", тот типа самый умный? Этого достаточно? Тада скажите это Ораку и про "картезиан туда же".

Кто знает? Мож они все бросят, восхитятся Вами и, может быть, в подарок Вам телевизор "врУчат", а может быть "вручАт".
А я тока после них начну в серьез относиться к Вашим этим типа новаторским мыстлям.
...
Рейтинг: 0 / 0
Хэширование
    #37087619
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 31.01.2011 1:50, exploys wrote:

> Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP.
> Тогда и не было бы смысла в HASH JOIN в принципе. Кроме того индексы могут быть,
> но не всегда могут применяться, к примеру при соединении трех больших таблиц. И
> к чему весь этот бред про более оптимальные алгоритмы?

Если индексы для JOIN-а ЕСТЬ и они МОГУТ применяться, они БУДУТ применяться.
Исключение -- МАЛЕНЬКИЕ таблицы типа 100 записей.

> Как вы обойдетесь без HASH JOIN, когда 3 таблицы имеют размеры от 1000000 строк?

NESTED LOOP

> Кэш тут вообще не причем.
> Таблицы не помещается в памяти - означает, что они не помещаются в памяти. Т.е.
> их размер больше чем свободное RAM. СУБД оценивает количество необходимых IO
> включая запись в Temp.

Ты не понял. Кэш тут при том, что оптимизаторы всегда считают, что кэш для
данного запроса пустой. Поэтому помещается оно в памяти, не помещается --
по барабану.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37087639
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NESTED LOOP на миллионных таблицах...
Мда господа, 5 баллов! :)
...
Рейтинг: 0 / 0
Хэширование
    #37087669
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysNESTED LOOP на миллионных таблицах...
Мда господа, 5 баллов! :)
Ну не тока нам:

http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%B2

И там есть, к примеру:

Соединение слиянием в отличие от соединения с использованием хэширования может использоваться при больших размерах соединяемых таблиц.

Вы собираетесь кувыркаться с таблицей хеширования, если меньшая табла "многомилионная", Ваше право. А я с опасением отношусь к таким идеям..
...
Рейтинг: 0 / 0
Хэширование
    #37087702
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да-да, только вам придется выполнить перед слиянием сортировку многомиллионных таблиц - самую тяжелую операцию.

Это не я так делаю, а оптимизаторы MS SQL и Oracle, а вы можете опасаться и дальше. Тем более, что очевидно вы так и не прочитали по приведённым ссылкам как на самом деле работает HASH JOIN.
...
Рейтинг: 0 / 0
Хэширование
    #37088027
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 31.01.2011 10:44, exploys wrote:

> NESTED LOOP на миллионных таблицах...
> Мда господа, 5 баллов! :)

А чем тебе NLJ на миллионных таблицах не нравится ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37088037
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 31.01.2011 11:09, exploys wrote:

> Да-да, только вам придется выполнить перед слиянием сортировку многомиллионных
> таблиц - самую тяжелую операцию.

Хэш-таблицу -то для многомиллионой таблицы тоже нужно построить, или как ?
Прочитать все записи и выложить их в хэш-таблицу.
Как иначе ты представляешь себе выполнение JOIN-а ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37088117
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы когда-нибудь с СУБД работали?
...
Рейтинг: 0 / 0
Хэширование
    #37088236
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysВы когда-нибудь с СУБД работали?Вы форумом не ошиблись ?
...
Рейтинг: 0 / 0
Хэширование
    #37088305
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirexploysВы когда-нибудь с СУБД работали?Вы форумом не ошиблись ?
Меня удивляет, что во-первых люди пишут не по теме поста, а во-вторых бред. Надо же как-то выяснить в чем причина.
...
Рейтинг: 0 / 0
Хэширование
    #37088358
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysа во-вторых бред. Надо же как-то выяснить в чем причина.Ну так Вы цитируйте конкретные места и указывайте с чем именно Вы не согласны. Желательно со ссылками на доку/источники, подтверждающие Вашу правоту. А то, действительно, больше на ПТ похоже.
...
Рейтинг: 0 / 0
Хэширование
    #37088488
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploys Тем более, что очевидно вы так и не прочитали по приведённым ссылкам как на самом деле работает HASH JOIN.

Зато я прочитал у Вас

exploys Соединение хэшированием применяется когда нету индексов.
.....
Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе.


Возиможно, это компенсируент пробелы в знаниях:

Это значительно поднимает ценность MERGE или NESTED LOOP. Ну тада собсно Хэш особо и не нужен получается, поскоку индексы понасоздавать может кажный.
...
Рейтинг: 0 / 0
Хэширование
    #37088636
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftexploysа во-вторых бред. Надо же как-то выяснить в чем причина.Ну так Вы цитируйте конкретные места и указывайте с чем именно Вы не согласны. Желательно со ссылками на доку/источники, подтверждающие Вашу правоту. А то, действительно, больше на ПТ похоже.
Вы чем читали? Я подробно все описал с сылками и примерами.
Лично вам я ответил и привел ссылки, что ваше описание HASH JOIN не полно и привел несколько ссылок.
...
Рейтинг: 0 / 0
Хэширование
    #37088651
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysЛично вам я ответил и привел ссылки, что ваше описание HASH JOIN не полно и привел несколько ссылок.Сорри, не вижу. Может, не мне, а MasterZiv-у?
...
Рейтинг: 0 / 0
Хэширование
    #37088679
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftexploysЛично вам я ответил и привел ссылки, что ваше описание HASH JOIN не полно и привел несколько ссылок.Сорри, не вижу. Может, не мне, а MasterZiv-у?
Может ему. Перечитайте весь топик и если разбираетесь поймете кто прав.

авторТак вот и я о чем. Что группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева. Но O(1) - может быть в случае отображения через хэш-функцию непосредственно адресов строк в памяти.

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

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

+
Основные сведения о хэш-соединениях
Выводы?
...
Рейтинг: 0 / 0
Хэширование
    #37088703
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoЭто значительно поднимает ценность MERGE или NESTED LOOP. Ну тада собсно Хэш особо и не нужен получается, поскоку индексы понасоздавать может кажный.
Т.е. по вашему всегда можно понасоздавать индексов и всегда они будут использоваться, а HASH JOIN в СУБД реализовали зря? :)
...
Рейтинг: 0 / 0
Хэширование
    #37088767
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysТ.е. по вашему всегда можно понасоздавать индексов и всегда они будут использоваться, а HASH JOIN в СУБД реализовали зря? :)
Нет это Вы сказали, что если есть индексы, то HASH JOIN не нужен. Я то так не считал до сих пор, что он эффективнее всех остальных алгоритмов при определенных факторах (соединение на равеннство, относительно небольшая меньшая табла) всех дуругих известных алгоритмов не зависмо от наличия индексов на соединемые поля. Т.е. создавай не создавай индексы, нельзя пока обойтись.

Но если Вы были правы, то можно было бы. Тада да, зря парились, поскоку "Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP".
...
Рейтинг: 0 / 0
Хэширование
    #37088810
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoexploysТ.е. по вашему всегда можно понасоздавать индексов и всегда они будут использоваться, а HASH JOIN в СУБД реализовали зря? :)
Нет это Вы сказали, что если есть индексы, то HASH JOIN не нужен. Я то так не считал до сих пор, что он эффективнее всех остальных алгоритмов при определенных факторах (соединение на равеннство, относительно небольшая меньшая табла) всех дуругих известных алгоритмов не зависмо от наличия индексов на соединемые поля. Т.е. создавай не создавай индексы, нельзя пока обойтись.

Но если Вы были правы, то можно было бы. Тада да, зря парились, поскоку "Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP".

Как вы обойдетесь без HASH JOIN, когда 3 таблицы имеют размеры от 1000000 строк?
Код: plaintext
1.
2.
SELECT *
FROM A INNER JOIN B ON A.ID = B.A_ID
INNER JOIN C ON B.ID = C.B_ID
По таблице B будет использоваться либо индекс по B.A_ID либо B.ID.

NESTED LOOP
авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы.

MERGE
авторСоединение слиянием — очень быстрая операция, но она может оказаться ресурсоемкой, если требуется выполнение операций сортировки .
...
Рейтинг: 0 / 0
Хэширование
    #37089375
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploys
Как вы обойдетесь без HASH JOIN...?

Ну Вы же сказали, что если создать индексы, то HASH JOIN не нужен. Чего же проще? Создайте индекс. Делов то. И обойдетесь.

А у меня идеи "обходиться" без какого-либо алгоритма вроде никада не было (как и вообще ,tp чего-либо имеющегося в Оракле). И, в частности, нет готовности "обоходиться" только одним хэшем, т.е. "обходиться" без вложенных циклов и слияний. Есть ситуации, для которых есть больше уверенности када какой алгоритм луче, а есть менее ясные. Соединение больших табл отношу к менее ясным ситуациям, в которых нуно смотреть конкретные ситуации.
И, возможно, "обойтись" одними только алгоритмами вообще не удастся. Можно буит тока посматреть какой хуже. Придется пытаться в основу "обхода" положить что-либо другое. Напрмер,рассматривать кластреры, таблы организованные по индексу, может мат представления как-то заюзать или как-то иначе заблаговременно вычислять результат соединений, чтобы в запросе юзера уже соединения не было.
...
Рейтинг: 0 / 0
Хэширование
    #37089391
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo,

Как вы обойдетесь без HASH JOIN, когда 3 таблицы имеют размеры от 1000000 строк?
Код: plaintext
1.
2.
SELECT *
FROM A INNER JOIN B ON A.ID = B.A_ID
INNER JOIN C ON B.ID = C.B_ID
Покрывающие индексы созданы по:
A.ID
B.A_ID
B.ID
C.B_ID
По таблице B будет использоваться либо индекс по B.A_ID либо по B.ID.

NESTED LOOP
авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы.

MERGE
авторСоединение слиянием — очень быстрая операция, но она может оказаться ресурсоемкой, если требуется выполнение операций сортировки .[/quot]
...
Рейтинг: 0 / 0
Хэширование
    #37089464
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysЕсли есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе.

exploysиндексы созданы


Ну на скока я понял Вы обошлись без HASH JOIN "в принципе"?

А я, если прикажет партия непеременно "обойтись" без HASH JOIN, напишу хинты, наверное, на случай если оптимизатор выберет HASH JOIN.
...
Рейтинг: 0 / 0
Хэширование
    #37089492
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoexploysЕсли есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе.

exploysиндексы созданы


Ну на скока я понял Вы обошлись без HASH JOIN "в принципе"?

А я, если прикажет партия непеременно "обойтись" без HASH JOIN, напишу хинты, наверное, на случай если оптимизатор выберет HASH JOIN.
Вы читать умеете?

По таблице B будет использоваться либо индекс по B.A_ID либо по B.ID.
Индекс создан, но использоваться не сможет. Поэтому хоть обсоздавайся индексов, без HASH JOIN ты тот запрос будешь выполнять до морковкеного заговенья. Именно потому, что таблицы не отсортированы, слишком велики и не помещаются в памяти.

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

Если укажите хинт MERGE JOIN, то пойдет сортировка - самая тяжелая операция. Таблицы не помещаются в памяти - значит сортировка будет происходить с использованием temp сохраняемого на диск. Вы представляете что это такое?
Вы когда-нибуть видели планы и их стоимость при использовании SORT IN TEMP?
...
Рейтинг: 0 / 0
Хэширование
    #37089580
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysИндекс создан, но использоваться не сможет. Поэтому хоть обсоздавайся индексов, без HASH JOIN ты тот запрос будешь выполнять до морковкеного заговенья. Именно потому, что таблицы не отсортированы, слишком велики и не помещаются в памяти. ?
А при чем тут я? Это у Вас:
"Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе."

Или это не Вы писали?

А я про отмену индексами HASH JOIN ниче не говорил.

Так что это Вы сами себя типа спросите.



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

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

exploysЕсли укажите хинт MERGE JOIN,

Ну я укажу хинт, если потребуют гарантировано "обойтись" без HASH JOIN. Каков был вопрос, таков был ответ.

exploysто пойдет сортировка - самая тяжелая операция.
Таблицы не помещаются в памяти - значит сортировка будет происходить с использованием temp сохраняемого на диск. Вы представляете что это такое?
Вы когда-нибуть видели планы и их стоимость при использовании SORT IN TEMP?

Ну хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела.

Оценку для сортировки, думау, по книжному примерно: 27*100000000 для одной таблы, а оценку соединеиия двух как сумму.

Самой тяжелой операцией по старинке считаю соединение.

Можно, конечно, надыбать и формулы для Хэш. И там есть лучшие и худьшие предположения.

А вот если одна табла поместилась в память, то, думау, ценка: 3* на сумму болков обоих табл. Это превзойти сложно, хотя слияние отсортированных это просто сумма блоков обоих табл.

Для больших табл, возможно, отклонения оценок от реальных цифр могут быть значительными.

Так или иначе, думаю, оставться на консервтивных позициях в этих вопросах все еще уместно: т.е. надо смотреть в кажном конкретном случае.
Но если в условиях соединение не эквивалентность, то думау, Хэш, скорее всего, в проигрыше.
...
Рейтинг: 0 / 0
Хэширование
    #37089600
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoНу хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела.

Ааа, у нас в MS. Вопросов больше не имею.


Короче топик про хэширование, предлагаю больше не офтопить леваком.
...
Рейтинг: 0 / 0
Хэширование
    #37089704
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysvadiminfoНу хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела.

Ааа, у нас в MS. Вопросов больше не имею.


Короче топик про хэширование, предлагаю больше не офтопить леваком.
Ну к Вам в "принципе" вопросов
не может быть после Ваших гипотез типа
"Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе."

А чтобы не было "леваков" к МСу, постите подобные мыстли, плиз, в своей СУБД или на крайняк в ПТ.
...
Рейтинг: 0 / 0
Хэширование
    #37090462
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo, даже жаль немного тебя

Это не мои гипотезы, это цитаты из документации.

NESTED LOOP
авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы.

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

Это не мои гипотезы, это цитаты из документации.

NESTED LOOP
авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы.

MERGE
авторСоединение слиянием — очень быстрая операция, но она может оказаться ресурсоемкой, если требуется выполнение операций сортировки .


Это да, это не Ваше. Это все давно известное и избитое.

А у Вас гипотеза новяк:
"Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе."
У Вас там и ранее было, что HASH JOIN применяется тока када нет индексов.
Возможно, Вы не видите разницы (связи в буквах опять не так установили), но она есть. Вы как бы все подготовили, чтобы "обходиться" без HASH JOIN.
А они нет. Ниче для этого не сделали.
...
Рейтинг: 0 / 0
Хэширование
    #37092322
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 31.01.2011 15:42, exploys wrote:
> Т.е. по вашему всегда можно понасоздавать индексов и всегда они будут
> использоваться, а HASH JOIN в СУБД реализовали зря? :)

Вообще полно СУБД, которые живут без этого, и вполне себе неплохо.
На одном NLJ.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37092343
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 01.02.2011 13:03, exploys wrote:

> Это не мои гипотезы, это цитаты из документации.
>
> NESTED LOOP < http://msdn.microsoft.com/ru-ru/library/ms191318.aspx>
> автор
> Соединение вложенных циклов является особенно эффективным в случае, когда
> внешние входные данные *сравнительно невелики*, а внутренние входные данные
> велики и заранее индексированы.
>

exploys , пойми, даже если это цитаты из документации, то пишется
она всё равно для обычных программистов, которые используют СУБД
и которые не знают и не должны знать (в первом приближении) про всё это.

Реально оптимизатор всё равно просто тупо считает стоимости разных
вариантов выполнения запроса (причём по эмпирическим формулам), и именно поэтому
так много предположений и гаданий на кофейной гуще о том, каким
правилам он следует. А он никаким не следует, он тупо считает и выбирает
самый дешёвый.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37092784
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА он никаким не следует

он по понятиям...
...
Рейтинг: 0 / 0
Хэширование
    #37092953
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabMasterZivА он никаким не следует

он по понятиям...
+1
...
Рейтинг: 0 / 0
Хэширование
    #37097143
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересный вопрос. Все упирается в принципе в вопрос что быстрее - построение хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются). В принципе не знаю как может быть сортировка быстрее, только если она каким-то образом меньше памяти требует.
...
Рейтинг: 0 / 0
Хэширование
    #37097596
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durak,

сортировка может быть быстрее, если её не делать. т.е. когда набор строк уже упорядочен должным образом.
...
Рейтинг: 0 / 0
Хэширование
    #37097749
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan DurakИнтересный вопрос. Все упирается в принципе в вопрос что быстрее - построение хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются). В принципе не знаю как может быть сортировка быстрее, только если она каким-то образом меньше памяти требует.
Число чтений при Сортировке оценивается число блоков умножить на логарифм числа блоков.
Слияние двух табл просто сложение (т.е. если отсортировано ты быстрее в 3 хеша). Стало быть сумма с логарифмами. Хешироваание если в памяти, то это утроенная сумма кол-ва блоков, а слияние сортировкой по прежнему с логарифмами. Ясно что в реальности это достаточно частый случай. Но если не помещается в памяти, то возникают рекурсии. Кроме того наскока помню оценки хэш достаточно сильно ухудшаются есче и оптимистичны: делается предположение что нет переполнения разделов. В любом случае оценки очень грубые. Конечно, в СУБД там алгоритмы всячески типа улучшаются в сранении с тем, что нам читали в лекциях. Если в условиях соединения не равенства, то хэш вроде вообще не рекомендуют.
Даже в тут приводимых цитатах, людей верящих в преимущества хэша, производили МС пишут: "может оказаться", а не "обязательно оказывается". Потому я и думау, что если меньшая табла достаточно веллика, то, скорее всего, просто надеяться на хэш было бы чрезмено торопливо.
...
Рейтинг: 0 / 0
Хэширование
    #37098040
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 01.02.2011 13:03, exploys wrote:

> Это не мои гипотезы, это цитаты из документации.
>
> NESTED LOOP < http://msdn.microsoft.com/ru-ru/library/ms191318.aspx>
> автор
> Соединение вложенных циклов является особенно эффективным в случае, когда
> внешние входные данные *сравнительно невелики*, а внутренние входные данные
> велики и заранее индексированы.
>

exploys , пойми, даже если это цитаты из документации, то пишется
она всё равно для обычных программистов, которые используют СУБД
и которые не знают и не должны знать (в первом приближении) про всё это.

Реально оптимизатор всё равно просто тупо считает стоимости разных
вариантов выполнения запроса (причём по эмпирическим формулам), и именно поэтому
так много предположений и гаданий на кофейной гуще о том, каким
правилам он следует. А он никаким не следует, он тупо считает и выбирает
самый дешёвый.

Вот тут ошибка. Оптимизатор умно считает, учитывая распределение по соединяемым столбцам и кардинальность. И сортировка имеет наибольшую стоимость. Особенно когда идет сортировка на дисках в TempDB (MS) или tablespace TEMP (Oracle).
И если таблицы не отсортированы по соединяемым столбцам то пойдет HASH JOIN.
То что для профессионала является закономерностью, для дилетанта может показаться божественным проявлением или случайностью.
Область применения MERGE JOIN и NESTED LOOP заранее определена ввиду легкости этих алгоритмов, во всех остальных случаях используется HASH JOIN. Особенно для больших неотсортированных таблиц.
...
Рейтинг: 0 / 0
Хэширование
    #37098065
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo
exploysто пойдет сортировка - самая тяжелая операция.
Таблицы не помещаются в памяти - значит сортировка будет происходить с использованием temp сохраняемого на диск. Вы представляете что это такое?
Вы когда-нибуть видели планы и их стоимость при использовании SORT IN TEMP?

Ну хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела .

Великий и могучий ораклоид. С такими завялениями вот по ссылкам спорить идите.
temp сортировка
Не используется temporary tablespace
авторtemporary tablespace используется исключительно для выполнения сортировок, которые нельзя выполнить в памяти, и для хранения глобальных временных таблиц. Поэтому на быстродействии отсутствие врем. табл.простр. сказаться уж никак не может. Проблема не в них.
И на металинке сами ищите.
...
Рейтинг: 0 / 0
Хэширование
    #37098149
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysvadiminfoпропущено...


Ну хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела .

Великий и могучий ораклоид. С такими завялениями вот по ссылкам спорить идите.
temp сортировка
Не используется temporary tablespace
авторtemporary tablespace используется исключительно для выполнения сортировок, которые нельзя выполнить в памяти, и для хранения глобальных временных таблиц. Поэтому на быстродействии отсутствие врем. табл.простр. сказаться уж никак не может. Проблема не в них.
И на металинке сами ищите.
С какой стати мне то это искать? Все источники оценивают алгоритмы в количестве чтений с диска. Нас так учили.
У Вас были траблы как Вы думаете с Temp (а на самом деле мож там Касперский все тормозил), ну так Вы и ходите там везде и спрашивайте, спорте. Ваше авторитет еще не досточен, чтобы отказываться от общепринятых подходов. Вы можете там и две строки месяц сортировать. Что теперь все книжки из-за этого переписывать?
...
Рейтинг: 0 / 0
Хэширование
    #37098167
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot exploysИ если таблицы не отсортированы по соединяемым столбцам то пойдет HASH JOIN.

Область применения MERGE JOIN и NESTED LOOP заранее определена ввиду легкости этих алгоритмов, во всех остальных случаях используется HASH JOIN. Особенно для больших неотсортированных таблиц.[/quot]
А почему далеко не всегда оптимизатор выбирает мерж (а выбирает хэш) когда идет простое соединение по индексированным столбцам?
...
Рейтинг: 0 / 0
Хэширование
    #37098194
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan DurakА почему далеко не всегда оптимизатор выбирает мерж (а выбирает хэш) когда идет простое соединение по индексированным столбцам?
Возможно, потому что индксированность столбцов и их отсортированность не одно и то же. При соединении нуно считать всю таблу, скорей всего. А зараз считавется нескока блоков. А в случае индексов, тока один блок данных и к тому же как минмум один индекса.
...
Рейтинг: 0 / 0
Хэширование
    #37098200
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. один блок данных за два считывания. Это конечно вопрос реализации СУБД и от версии к версии меняется. Но и оптимизаторы в разных версиях СУБД могут выбирать разные планы.
...
Рейтинг: 0 / 0
Хэширование
    #37098225
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 04.02.2011 10:34, Ivan Durak wrote:

> Интересный вопрос. Все упирается в принципе в вопрос что быстрее - построение
> хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются).

В теории построение хэш-таблицы быстрее.

Сортировка (самая быстрая): O(NlogN)
Хэш-таблицы: O(N)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37098232
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 04.02.2011 14:50, exploys wrote:

> Вот тут ошибка. Оптимизатор умно считает, учитывая распределение по соединяемым

Под "тупо считает" имелось в виду, что он не думает, как можно
выполнить этот запрос, а берёт все возможные планы и считает их стоимости.
Потом выбирает меньший по стоимости.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хэширование
    #37098255
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 04.02.2011 14:50, exploys wrote:

> Вот тут ошибка. Оптимизатор умно считает, учитывая распределение по соединяемым

Под "тупо считает" имелось в виду, что он не думает, как можно
выполнить этот запрос, а берёт все возможные планы и считает их стоимости.
Потом выбирает меньший по стоимости.

А стоимость физических операторов он откуда берёт, с потолка?
...
Рейтинг: 0 / 0
Хэширование
    #37098292
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoexploysvadiminfoпропущено...
Ну хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела .


Великий и могучий ораклоид. С такими завялениями вот по ссылкам спорить идите.
temp сортировка
Не используется temporary tablespace
пропущено...

И на металинке сами ищите.
С какой стати мне то это искать? Все источники оценивают алгоритмы в количестве чтений с диска. Нас так учили.
У Вас были траблы как Вы думаете с Temp (а на самом деле мож там Касперский все тормозил), ну так Вы и ходите там везде и спрашивайте, спорте. Ваше авторитет еще не досточен, чтобы отказываться от общепринятых подходов. Вы можете там и две строки месяц сортировать. Что теперь все книжки из-за этого переписывать?
У тебя галлюцинции, у меня никаких траблов с Temp никогда не было. А над Касперским на серваке СУБД - спасибо повеселил.
Теперь авторитеты начали искать? Для тебя и здравый смысл не авторитет и металинк, бол и уважаемые люди из раздела Oracle данного форума. И книжек вы не читали. И про Temp Tablespace в Oracle ничего не слышали и сортировку в нем. Вы делитант.
Для неучей вы может и покажетесь умным, для образованных вы останетесь делитантом.
...
Рейтинг: 0 / 0
Хэширование
    #37098313
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durak[quot exploysИ если таблицы не отсортированы по соединяемым столбцам то пойдет HASH JOIN.

Область применения MERGE JOIN и NESTED LOOP заранее определена ввиду легкости этих алгоритмов, во всех остальных случаях используется HASH JOIN. Особенно для больших неотсортированных таблиц.
А почему далеко не всегда оптимизатор выбирает мерж (а выбирает хэш) когда идет простое соединение по индексированным столбцам?[/quot]
Потому что индексы не всегда могут использоваться. Читайте выше уже несколько раз писал.
...
Рейтинг: 0 / 0
Хэширование
    #37098318
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 04.02.2011 10:34, Ivan Durak wrote:

> Интересный вопрос. Все упирается в принципе в вопрос что быстрее - построение
> хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются).

В теории построение хэш-таблицы быстрее.

Сортировка (самая быстрая): O(NlogN)
Хэш-таблицы: O(N)

кто-то выше сказал что-то около
Хэш-таблицы: 3 * O(N)
...
Рейтинг: 0 / 0
Хэширование
    #37098596
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysУ тебя галлюцинции, у меня никаких траблов с Temp никогда не было. А над Касперским на серваке СУБД - спасибо повеселил.
Теперь авторитеты начали искать? Для тебя и здравый смысл не авторитет и металинк, бол и уважаемые люди из раздела Oracle данного форума. И книжек вы не читали. И про Temp Tablespace в Oracle ничего не слышали и сортировку в нем. Вы делитант.
Для неучей вы может и покажетесь умным, для образованных вы останетесь делитантом.
Я не знаю с чего Вы взяли, что Ваша оценка моих знаний очень важна, и это что-то может изменить. Тем более, что Вы же не производите впечатление кого-то уважаемого. Возможно, Вы просто на что-то там обиделись. Мало ли.
Что до алгоритмов, то пока все еще для оценки этих алгоритмов в литературе используют кол-во считывний блоков. Вроде формул в которых есть ТЕМП не попадалось.
...
Рейтинг: 0 / 0
Хэширование
    #37098611
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoЧто до алгоритмов, то пока все еще для оценки этих алгоритмов в литературе используют кол-во считывний блоков. Вроде формул в которых есть ТЕМП не попадалось.
...
Рейтинг: 0 / 0
Хэширование
    #37098615
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoexploysУ тебя галлюцинции, у меня никаких траблов с Temp никогда не было. А над Касперским на серваке СУБД - спасибо повеселил.
Теперь авторитеты начали искать? Для тебя и здравый смысл не авторитет и металинк, бол и уважаемые люди из раздела Oracle данного форума. И книжек вы не читали. И про Temp Tablespace в Oracle ничего не слышали и сортировку в нем. Вы делитант.
Для неучей вы может и покажетесь умным, для образованных вы останетесь делитантом.
Я не знаю с чего Вы взяли, что Ваша оценка моих знаний очень важна, и это что-то может изменить. Тем более, что Вы же не производите впечатление кого-то уважаемого. Возможно, Вы просто на что-то там обиделись. Мало ли.
Ты читать то умеешь?
На дураков не обижаюсь.
...
Рейтинг: 0 / 0
Хэширование
    #37098725
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysТы читать то умеешь?
На дураков не обижаюсь.
Ну мож на умных обиделись какая разница? Впрочем какая разница? Эмоциональность не может изменить ситуацию: что там используется в СУБД для вычислений, скорей всего, не может гарантировать преимущество какому бы то ни было алгоритму. Ну посоветйуте МС отказаться от ТЕМП. Мож заинтересуются Вашим опытом.
...
Рейтинг: 0 / 0
Хэширование
    #37098730
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
иемется в виду как называются в СУБД структуры для сохранения промежуточных вычислений. Все равно, определяющим останется кол-во считываемых блоков.
...
Рейтинг: 0 / 0
Хэширование
    #37098853
exploys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoexploysТы читать то умеешь?
На дураков не обижаюсь.
Ну мож на умных обиделись какая разница? Впрочем какая разница? Эмоциональность не может изменить ситуацию: что там используется в СУБД для вычислений, скорей всего, не может гарантировать преимущество какому бы то ни было алгоритму. Ну посоветйуте МС отказаться от ТЕМП. Мож заинтересуются Вашим опытом.
Бред...
...
Рейтинг: 0 / 0
Хэширование
    #37099132
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exploysБред...
Ну Вам, конечно, виднее. Однако исключать что Вы просто перепутали форум все еще предевременно. Полно ить в инете форумов хоршо подходящих для проявлений повышенной эмоциональностей, каких-то простоватых субкультур.
Так или иначе, возможно, этих всех рассуждений все еще не достаточно, чтобы прийти к каким-то однозначным выводам относительно оценок алгоритмов.
...
Рейтинг: 0 / 0
Хэширование
    #37099483
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 04.02.2011 16:28, Ivan Durak wrote:

> кто-то выше сказал что-то около
> Хэш-таблицы: 3 * O(N)

O(3*N) и O(N) -- это одно и то же, если ты не в курсе.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
82 сообщений из 82, показаны все 4 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хэширование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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