|
|
|
Хэширование
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=37087327&tid=1542329]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
280ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 208ms |
| total: | 595ms |

| 0 / 0 |
