|
|
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Теоретически Хэширование при соединении таблиц и группировки имеет несколько приемуществ: хэш-функция 1. получая на вход значение ключа, на выходе дает адрес строки или указателя на строку 2. вырабатывает меньшее значение 3. равномерно распределеяет данные Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть может конкретный привести пример такой функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 16:45 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 26.01.2011 16:45, exploys wrote: > хэш-функция > 1. получая на вход значение ключа, на выходе дает адрес строки или указателя на > строку > 2. вырабатывает меньшее значение > 3. равномерно распределеяет данные > > Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть > может конкретный привести пример такой функции? Да. Например, сумма кодов всех символов, составляющих строку. Что такое > 2. вырабатывает меньшее значение > 3. равномерно распределеяет данные я вот лично не понял. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 17:34 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 26.01.2011 16:45, exploys wrote: > хэш-функция > 1. получая на вход значение ключа, на выходе дает адрес строки или указателя на > строку > 2. вырабатывает меньшее значение > 3. равномерно распределеяет данные > > Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть > может конкретный привести пример такой функции? Да. Например, сумма кодов всех символов, составляющих строку. Получаться какие-то непонятные разряженные значения. И как с помощью них обратиться к нужным участкам памяти? И вообще какой смысл у такой хэш-функции и чем она лучше чем просто значение ключа? Я так понимаю, что хэш-функция y=f(x), где x - ключ по которому идет хэширование y - адрес в памяти, где расположена строка или указатель на строку MasterZivЧто такое > 2. вырабатывает меньшее значение > 3. равномерно распределеяет данные я вот лично не понял. 2. хэширование - это свёртка, т.е. результат хэгирования может занимать меньший обхем памяти, но с возникновением коллизий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 18:21 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysИ как с помощью них обратиться к нужным участкам памяти? И вообще какой смысл у такой хэш-функцииЭто вы уже про Хеш-таблицу говорите, насколько я понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 18:31 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Зайдем с другого конца, в чем практическая польза значения хэш-функции от ключа вместо значения ключа при соединение хэшированием и группировках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 18:53 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploys, Считайте, что это такой метод разбить множество значений на группы, для которых верно следующее: - Если значения попали в разные группы, то они точно не равны. - Если значения попали в одну группу, то они могут быть равно. В итоге, чтобы найти соответствие (по условию "равно") очередному значению из какого-то списка, достаточно просматривать только ту же хэш-группу этого же (в случае GROUP BY) или другого (в случае JOIN) списка, а не весь список от начала до конца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 19:00 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
miksoftexploys, Считайте, что это такой метод разбить множество значений на группы, для которых верно следующее: - Если значения попали в разные группы, то они точно не равны. - Если значения попали в одну группу, то они могут быть равно. В итоге, чтобы найти соответствие (по условию "равно") очередному значению из какого-то списка, достаточно просматривать только ту же хэш-группу этого же (в случае GROUP BY) или другого (в случае JOIN) списка, а не весь список от начала до конца. Спасибо. Т.е. по простому двухуровневое дерево? И на этом польза от хэш-функция заканчивается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 19:06 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysИ на этом польза от хэш-функция заканчивается?Нет, конечно. Я отвечал на конкретный вопрос про "при соединение хэшированием и группировках". Почитайте хотя бы в википедии - Хеширование . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 19:20 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 26.01.2011 18:21, exploys wrote: > Получаться какие-то непонятные разряженные значения. И как с помощью них > обратиться к нужным участкам памяти? И вообще какой смысл у такой хэш-функции и > чем она лучше чем просто значение ключа? > Я так понимаю, что хэш-функция y=f(x), > где > x - ключ по которому идет хэширование > y - адрес в памяти, где расположена строка или указатель на строку Ну возьми ещё mod по размеру хэш-таблицы, и получишь индекс в хэш-таблице. Вообще, до тех пор пока тебе не надо писать хэш-таблицу самому (очень редко бывает) -- ты лучше не парься. Тебе надо только знать, что оно по ключу, и оно O(1). Всё, собственно. А если ты БД программируеш, то вообще только что это очень быстро. > > 2. хэширование - это свёртка, т.е. результат хэгирования может занимать меньший > обхем памяти, но с возникновением коллизий Это в частном случае только она может быть свёрткой. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 19:31 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 26.01.2011 18:53, exploys wrote: > Зайдем с другого конца, в чем практическая польза значения хэш-функции от ключа > вместо значения ключа при соединение хэшированием и группировках? Говорю, не парься. Это -- способ быстрого поиска данных по ключу. Как ищет -- уже неважно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 19:31 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 26.01.2011 19:06, exploys wrote: > Т.е. по простому двухуровневое дерево? И на этом польза от хэш-функция > заканчивается? Было бы двухуровневое дерево, был бы O(logN). А хэширование даёт O(1). Вот в том и польза. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 19:33 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 26.01.2011 19:06, exploys wrote: > Т.е. по простому двухуровневое дерево? И на этом польза от хэш-функция > заканчивается? Было бы двухуровневое дерево, был бы O(logN). А хэширование даёт O(1). Вот в том и польза. Так вот и я о чем. Что группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева. Но O(1) - может быть в случае отображения через хэш-функцию непосредственно адресов строк в памяти. О чем я писал в самом начале. Возвращаемся к первоначальному вопросу, кто-нибуть знает пример такой функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2011, 19:46 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 26.01.2011 19:46, exploys wrote: > Возвращаемся к первоначальному вопросу, кто-нибуть знает пример такой функции? Тебе зачем надо-то ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2011, 10:40 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysТеоретически Хэширование при соединении таблиц и группировки имеет несколько приемуществ: хэш-функция 1. получая на вход значение ключа, на выходе дает адрес строки или указателя на строку 2. вырабатывает меньшее значение 3. равномерно распределеяет данные Вопрос в следующем, каким образом практически реализуется 1, т.е. кто-нибуть может конкретный привести пример такой функции? Раньше я думал, что если соединение на равенство, и одна табла из соединяемых малая, то эту малую таблу скачивать в память моно один раз, и Хэширование сократит число циклов, за счет того, что значение сравнивается по значению только с одной группой записей, с которой совпал Хэш ключ. Допустим, эта малая табла разбита на 16 таких групп. Например, там 16 000 записей. Значение из второй таблы по ключу сравнивается с 15, и по конкретному значению только с той в которой совпал ключ. Т.е. вместо 16 000 цикл соствил 1000 + 15. А поскольку вся табла первая в памяти, то на этом все и исчерпывается. Но если первая табла не вся в памяти, то потребовалось бы считывать повторно блоки и из второй таблы, и хэширование могло потерять свои преимущества так как повторное чтение, могло бы, убить все это премущество. Если в условии соединения неравенства, то это преимущество не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2011, 11:20 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 26.01.2011 19:46, exploys wrote: > Возвращаемся к первоначальному вопросу, кто-нибуть знает пример такой функции? Тебе зачем надо-то ? Просто интересно. Неужели никто не знает? vadiminfo, Яж писал, про то что если ведомая таблица не помещается в памяти exploysЧто группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2011, 00:12 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfo, Яж писал, про то что если ведомая таблица не помещается в памяти exploysЧто группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева. [/quot] Ну я писал, что думал так ранее. Т.е. если а малая таблица ("ведомая" ли "ведущая" ли ) не помещается в памяти, то преимущества хэш при соединении становятся менее очевидными. Т.е., возможно, нужно уже смотреть и другие алгоритмы с целью повышения производительности и сравнивать. Т.е. выразил сомнения в преимуществах хэширования для СУБД у которых данные БД на дисках. У Вашей СУБД есть отимизатор? Ну посмотрите планы запросов для разных ситуаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2011, 08:21 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 28.01.2011 0:12, exploys wrote: > Просто интересно. Неужели никто не знает? Ну я знаю. Я тебе сказал в теме пример, чем он тебе не хорош -- я не понимаю. Для удовлетворения любопытсва -- вполне себе. [src C] [/src] > Что группировка по хэш значениям это второстепенная задача. Когда хэш-таблица > становиться *слишком большой* Хэш-таблица НИКОГДА не становится слишком большой. Она имеет всегда фиксированный объём. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2011, 11:25 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 28.01.2011 11:25, MasterZiv wrote: Блин, забыл запостить пример хэш-функции. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2011, 11:31 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZiv, vadiminfo, MS SQL BOL авторРекурсия хэша возникает, когда входные данные не помещаются в доступную память, что приводит к разбиению их на несколько отдельно обрабатываемых секций. Если какая-либо из этих секций все же не помещается в доступную память, она разбивается на подсекции, которые также обрабатываются отдельно. Процесс разбиения продолжается, либо пока все секции не будут помещаться в доступную память, либо пока не будет достигнут максимальный уровень рекурсии А за функцию спасибо, как вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2011, 14:10 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysMasterZiv, vadiminfo, MS SQL BOL авторРекурсия хэша возникает, когда входные данные не помещаются в доступную память, что приводит к разбиению их на несколько отдельно обрабатываемых секций. Если какая-либо из этих секций все же не помещается в доступную память, она разбивается на подсекции, которые также обрабатываются отдельно. Процесс разбиения продолжается, либо пока все секции не будут помещаться в доступную память, либо пока не будет достигнут максимальный уровень рекурсии Ну, хорошо. Я же не говорю, что хэш не возможен. Я же предполагаю, что утрачиваются преимущества, возможно, драмматично в количестве считываний блоков. Ведь теперь блоки второй - большой таблы придется считывать с дисков по новой? Ить их нельзя было сравнить с теми что были не в памяти? Либо держать их и малые многократно считывать? Могут оказаться алгоритмы, которые обеспечат меньшее кол-во считываний. А количество считываний как правило самое критичное для СУБД такого типа хранения данных. Иначе бы в планах запросов мы вседа бы видели хэш - алгоритмы. "Но этого не происходит"(C) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2011, 14:37 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfo Могут оказаться алгоритмы, которые обеспечат меньшее кол-во считываний. Это например какие алгоритмы? исключая: MERGE - только когда обе таблицы проиндексированы NESTED LOOP - только когда одна из таблиц крайне мала, а большая проиндексирована К слову в MS SQL только эти 3 алгоритма. Так какие же ещё ценные алгоритмы соединений они упустили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2011, 00:47 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 28.01.2011 11:25, MasterZiv wrote: Блин, забыл запостить пример хэш-функции. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вообще использоваться я так понимаю примерно так должно? Код: plaintext 1. 2. 3. 4. 9.2.2. Хэширование авторВ самом простом, классическом случае, свертка ключа используется как адрес в таблице, содержащей ключи и записи. Основным требованием к хэш-функции является равномерное распределение значение свертки . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2011, 01:25 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysvadiminfo Могут оказаться алгоритмы, которые обеспечат меньшее кол-во считываний. Это например какие алгоритмы? исключая: MERGE - только когда обе таблицы проиндексированы NESTED LOOP - только когда одна из таблиц крайне мала, а большая проиндексирована К слову в MS SQL только эти 3 алгоритма. Так какие же ещё ценные алгоритмы соединений они упустили? Ну, Ви там в MS SQL если хотите, то исключайте SORT MERGE и NESTED LOOP. А в Оракле, думау, все алгоритмы, включая перечисленные Вами, и так чрезмерно Вами ценимый алгоритм хэшированием (ить с ним надо сравнивать по Вашему только "ценные алгоритмы"), и в дополнение Cartesian еще какое-то время послужат. Ну, по крайней мере, до тех пока Вы не откроете, что даже приведенные Вами случаи? када такие алгоритмы имеют преимущество, более не представляют интереса для практики. А ить в соединении где в условиях могут быть неравенства. А есть соедиения, где надо вернуть только первую строку (Например в SQL выражениях типа EXISTS). Кроме того, если таблы малы? и их можно отсортировать в ОП, то SORT MERGE посему не проканает? Наконец, кроме этого соединения в запросе могут быть другие операции, для которых все равно нужна сортировка. Кста, хотел бы обратить внимание Ваше, что NESTED LOOP - пока еще самый общий, и потому незаменимый алгоритм. При помощи соединения вложенными циклами можно реализовать любое условие соединения. И как и раньше, думау, что есль соединяемые таблы очень большие, то хэширование, возможно, с каког-то момента их увеличения, возможно, не буит иметь преимуществ перед не "ценным" NESTED LOOP, а если отсортировано то SORT MERGE. На крайняк все окажутся не приемлемыми, и придется как-то по другому разруливать. Понятие "ценные алгоритмы" не совсем ясно, так как не сталкивался с делением алгоритмов, используемых при оптимизации запросов по ценностной шкале. Потому, плиз, не нуно мне ниче подобного приписыть. Я ни про какие ценные и не ценные не говорил. Говорил про другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2011, 21:15 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfo, какой-то бессвязный набор букв. Мы рассматриваем Хэширование. Соединение хэшированием применяется когда нету индексов. Вы высказали мнение, что если обе таблицы не поместятся в памяти то хэширование не оптимально. Т.е. в этом случае, когда нету индексов и обе таблицы не помещаются в памяти по вашему оптимальнее будет использовать SORT MERGE и NESTED LOOP? А уж как вы решили соединение хэшированием заменить картезианом вообще непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2011, 22:41 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysvadiminfo, какой-то бессвязный набор букв. Мы рассматриваем Хэширование. Соединение хэшированием применяется когда нету индексов. Вы высказали мнение, что если обе таблицы не поместятся в памяти то хэширование не оптимально. Т.е. в этом случае, когда нету индексов и обе таблицы не помещаются в памяти по вашему оптимальнее будет использовать SORT MERGE и NESTED LOOP? А уж как вы решили соединение хэшированием заменить картезианом вообще непонятно. А когда есть индексы "Соединение хэшированием" не применимо? А планы в Оракле с хэшированием для индексированных попадаются. Я вроде высказал, что может терять преимущества. Т.е. может оказаться не оптимальным, а не оказывается обязательно не отимальным. Это даже не означет в общем случае что, кто-то луче, Это означет, что ОНО не луче. Например, все плохи. Вы и в правду, как-то не совсем удачно связываете буквы. Уточню что хотел сказать тада есче раз: Я хотел сказать, что признау, что хэширование саммый эффективный способ при относительно небольшом размере меньшей таблы. Особенно када она помещается в памяти. Не зависимо ни от наличия или отсутсвия индексов или чего либо еще. Но чем больше меньшая табла, тем более эти преимущества более утрачиваются с момента как она не помещается в памяти. Эта эффективность тает. И не исключаю, что SORT MERGE и NESTED LOOP могут быть как минимум не хуже. Про "нету индексов" я ниче не говорил. С какой стати? Не знау зачем их не создавать, если речь об оптимизации, и они могут помочь. Не нуно, плиз, приписывать мне ниче такого. Если бы Вы нашли бы связи в буквах, то типа я там приводил и др случаи када хэширование не канает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2011, 23:50 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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. (Приводится один из самых тупейших алгоритмов обработки переполнения хэша.) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 00:21 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 00:28 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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. MasterZiv> Т.е. в этом случае, когда нету индексов и обе таблицы не помещаются в памяти по > вашему оптимальнее будет использовать SORT MERGE и NESTED LOOP? 1) как правило СУБД никогда не завязываются на содержимое кэша при составлении планов. Кэш потому что может быть и почищен ко времени выполнения запроса. Кэш тут вообще не причем. Таблицы не помещается в памяти - означает, что они не помещаются в памяти. Т.е. их размер больше чем свободное RAM. СУБД оценивает количество необходимых IO включая запись в Temp. vadiminfo , SORT MERGE это вообще сортировка слиянием и никакого отношения к соединениям не имеет. А NESTED LOOP используется когда одна из таблиц исключительно мала и никак не может применяться для соединения двух больших таблиц. Учите матчасть. С картезианом туда же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 01:50 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploys vadiminfo , SORT MERGE это вообще сортировка слиянием и никакого отношения к соединениям не имеет. А NESTED LOOP используется когда одна из таблиц исключительно мала и никак не может применяться для соединения двух больших таблиц. Учите матчасть. С картезианом туда же. Т.е. Вы думаете, что при соединении, када юзается алгоритм в котором есть слово "MERGE" сортитровка не имеет никакого отношения, зато есть некоея сортировка слиянием одной таблы? Которая "SORT MERGE это вообще сортировка слиянием и никакого отношения к соединениям не имеет"? Вообще до Вас это был "Алгоритм соединения слиянием сортированных списков ". Его могут в СУБД называть и MERGE и SORT MERGE. Так или иначе в Оракле нпазывается SORT MERGE имеет отношение именно к соединениям. Конечно, у Оракла юзается слов MERGE, паример для команды DML, в которой и INSERT и UPDATE. А также и в оптимизатрое есть трасформация представлений View Merging. Но алгоритм доступа к данным тока SORT MERGE. Никакой сортировка слиянием, "и никакого отношения к соединениям не имеет" там нет пока есче. Ну Вы используйте NESTED LOOP када хотите, а я уверенно када обе малы, либо условия соединения таковы, что никакие другие алогоритмы не уместны. В остальных случаях бум посматрет. Думаете кто первый сказал "Учите мат часть", тот типа самый умный? Этого достаточно? Тада скажите это Ораку и про "картезиан туда же". Кто знает? Мож они все бросят, восхитятся Вами и, может быть, в подарок Вам телевизор "врУчат", а может быть "вручАт". А я тока после них начну в серьез относиться к Вашим этим типа новаторским мыстлям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 09:34 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 10:34 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
NESTED LOOP на миллионных таблицах... Мда господа, 5 баллов! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 10:44 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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 И там есть, к примеру: Соединение слиянием в отличие от соединения с использованием хэширования может использоваться при больших размерах соединяемых таблиц. Вы собираетесь кувыркаться с таблицей хеширования, если меньшая табла "многомилионная", Ваше право. А я с опасением отношусь к таким идеям.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 10:55 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Да-да, только вам придется выполнить перед слиянием сортировку многомиллионных таблиц - самую тяжелую операцию. Это не я так делаю, а оптимизаторы MS SQL и Oracle, а вы можете опасаться и дальше. Тем более, что очевидно вы так и не прочитали по приведённым ссылкам как на самом деле работает HASH JOIN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 11:09 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 31.01.2011 10:44, exploys wrote: > NESTED LOOP на миллионных таблицах... > Мда господа, 5 баллов! :) А чем тебе NLJ на миллионных таблицах не нравится ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 12:50 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 31.01.2011 11:09, exploys wrote: > Да-да, только вам придется выполнить перед слиянием сортировку многомиллионных > таблиц - самую тяжелую операцию. Хэш-таблицу -то для многомиллионой таблицы тоже нужно построить, или как ? Прочитать все записи и выложить их в хэш-таблицу. Как иначе ты представляешь себе выполнение JOIN-а ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 12:52 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Вы когда-нибудь с СУБД работали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 13:14 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysВы когда-нибудь с СУБД работали?Вы форумом не ошиблись ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 13:41 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
tanglirexploysВы когда-нибудь с СУБД работали?Вы форумом не ошиблись ? Меня удивляет, что во-первых люди пишут не по теме поста, а во-вторых бред. Надо же как-то выяснить в чем причина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 13:56 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysа во-вторых бред. Надо же как-то выяснить в чем причина.Ну так Вы цитируйте конкретные места и указывайте с чем именно Вы не согласны. Желательно со ссылками на доку/источники, подтверждающие Вашу правоту. А то, действительно, больше на ПТ похоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 14:09 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploys Тем более, что очевидно вы так и не прочитали по приведённым ссылкам как на самом деле работает HASH JOIN. Зато я прочитал у Вас exploys Соединение хэшированием применяется когда нету индексов. ..... Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе. Возиможно, это компенсируент пробелы в знаниях: Это значительно поднимает ценность MERGE или NESTED LOOP. Ну тада собсно Хэш особо и не нужен получается, поскоку индексы понасоздавать может кажный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 14:47 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
miksoftexploysа во-вторых бред. Надо же как-то выяснить в чем причина.Ну так Вы цитируйте конкретные места и указывайте с чем именно Вы не согласны. Желательно со ссылками на доку/источники, подтверждающие Вашу правоту. А то, действительно, больше на ПТ похоже. Вы чем читали? Я подробно все описал с сылками и примерами. Лично вам я ответил и привел ссылки, что ваше описание HASH JOIN не полно и привел несколько ссылок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 15:26 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysЛично вам я ответил и привел ссылки, что ваше описание HASH JOIN не полно и привел несколько ссылок.Сорри, не вижу. Может, не мне, а MasterZiv-у? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 15:29 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
miksoftexploysЛично вам я ответил и привел ссылки, что ваше описание HASH JOIN не полно и привел несколько ссылок.Сорри, не вижу. Может, не мне, а MasterZiv-у? Может ему. Перечитайте весь топик и если разбираетесь поймете кто прав. авторТак вот и я о чем. Что группировка по хэш значениям это второстепенная задача. Когда хэш-таблица становиться слишком большой тогда действительно она делиться на группы по хэш-функции выполняющей роль двухуровневого дерева. Но O(1) - может быть в случае отображения через хэш-функцию непосредственно адресов строк в памяти. Хэширование авторВ самом простом, классическом случае, свертка ключа используется как адрес в таблице , содержащей ключи и записи. Основным требованием к хэш-функции является равномерное распределение значение свертки. автор Рекурсия хэша возникает, когда входные данные не помещаются в доступную память , что приводит к разбиению их на несколько отдельно обрабатываемых секций. Если какая-либо из этих секций все же не помещается в доступную память, она разбивается на подсекции, которые также обрабатываются отдельно. Процесс разбиения продолжается, либо пока все секции не будут помещаться в доступную память, либо пока не будет достигнут максимальный уровень рекурсии + Основные сведения о хэш-соединениях Выводы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 15:36 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfoЭто значительно поднимает ценность MERGE или NESTED LOOP. Ну тада собсно Хэш особо и не нужен получается, поскоку индексы понасоздавать может кажный. Т.е. по вашему всегда можно понасоздавать индексов и всегда они будут использоваться, а HASH JOIN в СУБД реализовали зря? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 15:42 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysТ.е. по вашему всегда можно понасоздавать индексов и всегда они будут использоваться, а HASH JOIN в СУБД реализовали зря? :) Нет это Вы сказали, что если есть индексы, то HASH JOIN не нужен. Я то так не считал до сих пор, что он эффективнее всех остальных алгоритмов при определенных факторах (соединение на равеннство, относительно небольшая меньшая табла) всех дуругих известных алгоритмов не зависмо от наличия индексов на соединемые поля. Т.е. создавай не создавай индексы, нельзя пока обойтись. Но если Вы были правы, то можно было бы. Тада да, зря парились, поскоку "Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 16:09 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfoexploysТ.е. по вашему всегда можно понасоздавать индексов и всегда они будут использоваться, а HASH JOIN в СУБД реализовали зря? :) Нет это Вы сказали, что если есть индексы, то HASH JOIN не нужен. Я то так не считал до сих пор, что он эффективнее всех остальных алгоритмов при определенных факторах (соединение на равеннство, относительно небольшая меньшая табла) всех дуругих известных алгоритмов не зависмо от наличия индексов на соединемые поля. Т.е. создавай не создавай индексы, нельзя пока обойтись. Но если Вы были правы, то можно было бы. Тада да, зря парились, поскоку "Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP". Как вы обойдетесь без HASH JOIN, когда 3 таблицы имеют размеры от 1000000 строк? Код: plaintext 1. 2. NESTED LOOP авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы. MERGE авторСоединение слиянием — очень быстрая операция, но она может оказаться ресурсоемкой, если требуется выполнение операций сортировки . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 16:24 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploys Как вы обойдетесь без HASH JOIN...? Ну Вы же сказали, что если создать индексы, то HASH JOIN не нужен. Чего же проще? Создайте индекс. Делов то. И обойдетесь. А у меня идеи "обходиться" без какого-либо алгоритма вроде никада не было (как и вообще ,tp чего-либо имеющегося в Оракле). И, в частности, нет готовности "обоходиться" только одним хэшем, т.е. "обходиться" без вложенных циклов и слияний. Есть ситуации, для которых есть больше уверенности када какой алгоритм луче, а есть менее ясные. Соединение больших табл отношу к менее ясным ситуациям, в которых нуно смотреть конкретные ситуации. И, возможно, "обойтись" одними только алгоритмами вообще не удастся. Можно буит тока посматреть какой хуже. Придется пытаться в основу "обхода" положить что-либо другое. Напрмер,рассматривать кластреры, таблы организованные по индексу, может мат представления как-то заюзать или как-то иначе заблаговременно вычислять результат соединений, чтобы в запросе юзера уже соединения не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 21:33 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfo, Как вы обойдетесь без HASH JOIN, когда 3 таблицы имеют размеры от 1000000 строк? Код: plaintext 1. 2. A.ID B.A_ID B.ID C.B_ID По таблице B будет использоваться либо индекс по B.A_ID либо по B.ID. NESTED LOOP авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы. MERGE авторСоединение слиянием — очень быстрая операция, но она может оказаться ресурсоемкой, если требуется выполнение операций сортировки .[/quot] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 21:46 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysЕсли есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе. exploysиндексы созданы Ну на скока я понял Вы обошлись без HASH JOIN "в принципе"? А я, если прикажет партия непеременно "обойтись" без HASH JOIN, напишу хинты, наверное, на случай если оптимизатор выберет HASH JOIN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 22:56 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2011, 23:15 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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* на сумму болков обоих табл. Это превзойти сложно, хотя слияние отсортированных это просто сумма блоков обоих табл. Для больших табл, возможно, отклонения оценок от реальных цифр могут быть значительными. Так или иначе, думаю, оставться на консервтивных позициях в этих вопросах все еще уместно: т.е. надо смотреть в кажном конкретном случае. Но если в условиях соединение не эквивалентность, то думау, Хэш, скорее всего, в проигрыше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2011, 00:20 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfoНу хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела. Ааа, у нас в MS. Вопросов больше не имею. Короче топик про хэширование, предлагаю больше не офтопить леваком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2011, 01:03 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysvadiminfoНу хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела. Ааа, у нас в MS. Вопросов больше не имею. Короче топик про хэширование, предлагаю больше не офтопить леваком. Ну к Вам в "принципе" вопросов не может быть после Ваших гипотез типа "Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе." А чтобы не было "леваков" к МСу, постите подобные мыстли, плиз, в своей СУБД или на крайняк в ПТ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2011, 08:15 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfo, даже жаль немного тебя Это не мои гипотезы, это цитаты из документации. NESTED LOOP авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы. MERGE авторСоединение слиянием — очень быстрая операция, но она может оказаться ресурсоемкой, если требуется выполнение операций сортировки . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2011, 13:03 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysvadiminfo, даже жаль немного тебя Это не мои гипотезы, это цитаты из документации. NESTED LOOP авторСоединение вложенных циклов является особенно эффективным в случае, когда внешние входные данные сравнительно невелики , а внутренние входные данные велики и заранее индексированы. MERGE авторСоединение слиянием — очень быстрая операция, но она может оказаться ресурсоемкой, если требуется выполнение операций сортировки . Это да, это не Ваше. Это все давно известное и избитое. А у Вас гипотеза новяк: "Если есть индексы по обоим полям то применялось бы всегда MERGE или NESTED LOOP. Тогда и не было бы смысла в HASH JOIN в принципе." У Вас там и ранее было, что HASH JOIN применяется тока када нет индексов. Возможно, Вы не видите разницы (связи в буквах опять не так установили), но она есть. Вы как бы все подготовили, чтобы "обходиться" без HASH JOIN. А они нет. Ниче для этого не сделали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2011, 13:31 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 31.01.2011 15:42, exploys wrote: > Т.е. по вашему всегда можно понасоздавать индексов и всегда они будут > использоваться, а HASH JOIN в СУБД реализовали зря? :) Вообще полно СУБД, которые живут без этого, и вполне себе неплохо. На одном NLJ. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2011, 10:15 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2011, 10:20 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZivА он никаким не следует он по понятиям... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2011, 12:29 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
mcureenabMasterZivА он никаким не следует он по понятиям... +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2011, 13:15 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Интересный вопрос. Все упирается в принципе в вопрос что быстрее - построение хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются). В принципе не знаю как может быть сортировка быстрее, только если она каким-то образом меньше памяти требует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 10:34 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Ivan Durak, сортировка может быть быстрее, если её не делать. т.е. когда набор строк уже упорядочен должным образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 12:22 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Ivan DurakИнтересный вопрос. Все упирается в принципе в вопрос что быстрее - построение хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются). В принципе не знаю как может быть сортировка быстрее, только если она каким-то образом меньше памяти требует. Число чтений при Сортировке оценивается число блоков умножить на логарифм числа блоков. Слияние двух табл просто сложение (т.е. если отсортировано ты быстрее в 3 хеша). Стало быть сумма с логарифмами. Хешироваание если в памяти, то это утроенная сумма кол-ва блоков, а слияние сортировкой по прежнему с логарифмами. Ясно что в реальности это достаточно частый случай. Но если не помещается в памяти, то возникают рекурсии. Кроме того наскока помню оценки хэш достаточно сильно ухудшаются есче и оптимистичны: делается предположение что нет переполнения разделов. В любом случае оценки очень грубые. Конечно, в СУБД там алгоритмы всячески типа улучшаются в сранении с тем, что нам читали в лекциях. Если в условиях соединения не равенства, то хэш вроде вообще не рекомендуют. Даже в тут приводимых цитатах, людей верящих в преимущества хэша, производили МС пишут: "может оказаться", а не "обязательно оказывается". Потому я и думау, что если меньшая табла достаточно веллика, то, скорее всего, просто надеяться на хэш было бы чрезмено торопливо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 13:19 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
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. Особенно для больших неотсортированных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 14:50 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfo exploysто пойдет сортировка - самая тяжелая операция. Таблицы не помещаются в памяти - значит сортировка будет происходить с использованием temp сохраняемого на диск. Вы представляете что это такое? Вы когда-нибуть видели планы и их стоимость при использовании SORT IN TEMP? Ну хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела . Великий и могучий ораклоид. С такими завялениями вот по ссылкам спорить идите. temp сортировка Не используется temporary tablespace авторtemporary tablespace используется исключительно для выполнения сортировок, которые нельзя выполнить в памяти, и для хранения глобальных временных таблиц. Поэтому на быстродействии отсутствие врем. табл.простр. сказаться уж никак не может. Проблема не в них. И на металинке сами ищите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 14:58 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysvadiminfoпропущено... Ну хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела . Великий и могучий ораклоид. С такими завялениями вот по ссылкам спорить идите. temp сортировка Не используется temporary tablespace авторtemporary tablespace используется исключительно для выполнения сортировок, которые нельзя выполнить в памяти, и для хранения глобальных временных таблиц. Поэтому на быстродействии отсутствие врем. табл.простр. сказаться уж никак не может. Проблема не в них. И на металинке сами ищите. С какой стати мне то это искать? Все источники оценивают алгоритмы в количестве чтений с диска. Нас так учили. У Вас были траблы как Вы думаете с Temp (а на самом деле мож там Касперский все тормозил), ну так Вы и ходите там везде и спрашивайте, спорте. Ваше авторитет еще не досточен, чтобы отказываться от общепринятых подходов. Вы можете там и две строки месяц сортировать. Что теперь все книжки из-за этого переписывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 15:29 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
[quot exploysИ если таблицы не отсортированы по соединяемым столбцам то пойдет HASH JOIN. Область применения MERGE JOIN и NESTED LOOP заранее определена ввиду легкости этих алгоритмов, во всех остальных случаях используется HASH JOIN. Особенно для больших неотсортированных таблиц.[/quot] А почему далеко не всегда оптимизатор выбирает мерж (а выбирает хэш) когда идет простое соединение по индексированным столбцам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 15:37 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Ivan DurakА почему далеко не всегда оптимизатор выбирает мерж (а выбирает хэш) когда идет простое соединение по индексированным столбцам? Возможно, потому что индксированность столбцов и их отсортированность не одно и то же. При соединении нуно считать всю таблу, скорей всего. А зараз считавется нескока блоков. А в случае индексов, тока один блок данных и к тому же как минмум один индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 15:47 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
т.е. один блок данных за два считывания. Это конечно вопрос реализации СУБД и от версии к версии меняется. Но и оптимизаторы в разных версиях СУБД могут выбирать разные планы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 15:49 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 04.02.2011 10:34, Ivan Durak wrote: > Интересный вопрос. Все упирается в принципе в вопрос что быстрее - построение > хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются). В теории построение хэш-таблицы быстрее. Сортировка (самая быстрая): O(NlogN) Хэш-таблицы: O(N) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 15:56 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
On 04.02.2011 14:50, exploys wrote: > Вот тут ошибка. Оптимизатор умно считает, учитывая распределение по соединяемым Под "тупо считает" имелось в виду, что он не думает, как можно выполнить этот запрос, а берёт все возможные планы и считает их стоимости. Потом выбирает меньший по стоимости. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 15:58 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 04.02.2011 14:50, exploys wrote: > Вот тут ошибка. Оптимизатор умно считает, учитывая распределение по соединяемым Под "тупо считает" имелось в виду, что он не думает, как можно выполнить этот запрос, а берёт все возможные планы и считает их стоимости. Потом выбирает меньший по стоимости. А стоимость физических операторов он откуда берёт, с потолка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 16:05 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfoexploysvadiminfoпропущено... Ну хорошо. Не помещаются. Temp - это уже Ваши там какие-то МS дела . Великий и могучий ораклоид. С такими завялениями вот по ссылкам спорить идите. temp сортировка Не используется temporary tablespace пропущено... И на металинке сами ищите. С какой стати мне то это искать? Все источники оценивают алгоритмы в количестве чтений с диска. Нас так учили. У Вас были траблы как Вы думаете с Temp (а на самом деле мож там Касперский все тормозил), ну так Вы и ходите там везде и спрашивайте, спорте. Ваше авторитет еще не досточен, чтобы отказываться от общепринятых подходов. Вы можете там и две строки месяц сортировать. Что теперь все книжки из-за этого переписывать? У тебя галлюцинции, у меня никаких траблов с Temp никогда не было. А над Касперским на серваке СУБД - спасибо повеселил. Теперь авторитеты начали искать? Для тебя и здравый смысл не авторитет и металинк, бол и уважаемые люди из раздела Oracle данного форума. И книжек вы не читали. И про Temp Tablespace в Oracle ничего не слышали и сортировку в нем. Вы делитант. Для неучей вы может и покажетесь умным, для образованных вы останетесь делитантом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 16:19 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
Ivan Durak[quot exploysИ если таблицы не отсортированы по соединяемым столбцам то пойдет HASH JOIN. Область применения MERGE JOIN и NESTED LOOP заранее определена ввиду легкости этих алгоритмов, во всех остальных случаях используется HASH JOIN. Особенно для больших неотсортированных таблиц. А почему далеко не всегда оптимизатор выбирает мерж (а выбирает хэш) когда идет простое соединение по индексированным столбцам?[/quot] Потому что индексы не всегда могут использоваться. Читайте выше уже несколько раз писал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 16:26 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 04.02.2011 10:34, Ivan Durak wrote: > Интересный вопрос. Все упирается в принципе в вопрос что быстрее - построение > хэш-таблицы или сортировка (при мердже вроде как даже обе таблицы сортируются). В теории построение хэш-таблицы быстрее. Сортировка (самая быстрая): O(NlogN) Хэш-таблицы: O(N) кто-то выше сказал что-то около Хэш-таблицы: 3 * O(N) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 16:28 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysУ тебя галлюцинции, у меня никаких траблов с Temp никогда не было. А над Касперским на серваке СУБД - спасибо повеселил. Теперь авторитеты начали искать? Для тебя и здравый смысл не авторитет и металинк, бол и уважаемые люди из раздела Oracle данного форума. И книжек вы не читали. И про Temp Tablespace в Oracle ничего не слышали и сортировку в нем. Вы делитант. Для неучей вы может и покажетесь умным, для образованных вы останетесь делитантом. Я не знаю с чего Вы взяли, что Ваша оценка моих знаний очень важна, и это что-то может изменить. Тем более, что Вы же не производите впечатление кого-то уважаемого. Возможно, Вы просто на что-то там обиделись. Мало ли. Что до алгоритмов, то пока все еще для оценки этих алгоритмов в литературе используют кол-во считывний блоков. Вроде формул в которых есть ТЕМП не попадалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 18:54 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfoЧто до алгоритмов, то пока все еще для оценки этих алгоритмов в литературе используют кол-во считывний блоков. Вроде формул в которых есть ТЕМП не попадалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 19:03 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfoexploysУ тебя галлюцинции, у меня никаких траблов с Temp никогда не было. А над Касперским на серваке СУБД - спасибо повеселил. Теперь авторитеты начали искать? Для тебя и здравый смысл не авторитет и металинк, бол и уважаемые люди из раздела Oracle данного форума. И книжек вы не читали. И про Temp Tablespace в Oracle ничего не слышали и сортировку в нем. Вы делитант. Для неучей вы может и покажетесь умным, для образованных вы останетесь делитантом. Я не знаю с чего Вы взяли, что Ваша оценка моих знаний очень важна, и это что-то может изменить. Тем более, что Вы же не производите впечатление кого-то уважаемого. Возможно, Вы просто на что-то там обиделись. Мало ли. Ты читать то умеешь? На дураков не обижаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 19:05 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysТы читать то умеешь? На дураков не обижаюсь. Ну мож на умных обиделись какая разница? Впрочем какая разница? Эмоциональность не может изменить ситуацию: что там используется в СУБД для вычислений, скорей всего, не может гарантировать преимущество какому бы то ни было алгоритму. Ну посоветйуте МС отказаться от ТЕМП. Мож заинтересуются Вашим опытом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 20:21 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
иемется в виду как называются в СУБД структуры для сохранения промежуточных вычислений. Все равно, определяющим останется кол-во считываемых блоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 20:27 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
vadiminfoexploysТы читать то умеешь? На дураков не обижаюсь. Ну мож на умных обиделись какая разница? Впрочем какая разница? Эмоциональность не может изменить ситуацию: что там используется в СУБД для вычислений, скорей всего, не может гарантировать преимущество какому бы то ни было алгоритму. Ну посоветйуте МС отказаться от ТЕМП. Мож заинтересуются Вашим опытом. Бред... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2011, 22:32 |
|
||
|
Хэширование
|
|||
|---|---|---|---|
|
#18+
exploysБред... Ну Вам, конечно, виднее. Однако исключать что Вы просто перепутали форум все еще предевременно. Полно ить в инете форумов хоршо подходящих для проявлений повышенной эмоциональностей, каких-то простоватых субкультур. Так или иначе, возможно, этих всех рассуждений все еще не достаточно, чтобы прийти к каким-то однозначным выводам относительно оценок алгоритмов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2011, 10:19 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1542329]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
420ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
125ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 816ms |

| 0 / 0 |
