Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hash join на больших таблицах / 23 сообщений из 23, страница 1 из 1
08.10.2019, 22:41
    #39873657
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Друзья, возник вопрос касательно hj и nl.
Гугление и опрос людей в коллективе поражает разные мнения и неочевидные выводы. Собственно сабж

Будет ли работать hj когда ни одна из таблиц не помещается в память? Как оракул будет выполнять такой запрос? Включит nl?

Какие могут быть ситуациикогда nl окажется быстрее hj?

Из ответов от своих коллег - hj всегда, ну или на 90% всегда быстрее и эффективнее. Зависимость от индексов и сективности. Когда к большой таблице присоединяется мелкая nl эффективнее и т.д.

Все ответы наверняка справедливы и правильные, но все же вопрос из собеседования, оппонент ожидал ответ «если ни одна из таблиц не помещается в памяти hj работать не будет вообще», так ли это?
...
Рейтинг: 0 / 0
08.10.2019, 22:54
    #39873661
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
...
Рейтинг: 0 / 0
09.10.2019, 02:44
    #39873700
Vivat!San
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Есть такая вьюха - V$PGA_TARGET_ADVICE_HISTOGRAM

как думаешь что значат поля estd_onepass_executions, estd_multipasses_executions?
...
Рейтинг: 0 / 0
09.10.2019, 07:08
    #39873707
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
кит северных морей 14840489 такая же вода, без явного определения и ответа. Вообще чел спрашивает - верны ли его суждения?

Про dwh, мой коллега говорит что там всегда только hj, и он правильно говорит. Но тогда какого хрена я уже 3-й раз нахожу - если одна из таблиц помещается в ram. Да ни одна не помещается, и что?
...
Рейтинг: 0 / 0
09.10.2019, 07:26
    #39873709
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Хуже того, про память я везде натыкаюсь как на условие для hj, одна из таблиц должна вся помешаться в память, ну и не поместилась и что? Ну запишется на диск. Хоть и дали мне ответ, тогда nl отработает вместо hj, я в это не верю и для меня это неочевидно. Вложенный цикл в таких условиях будет отрабатывать просто вечно и весь dwh должен на nl работать - но это же бред.
...
Рейтинг: 0 / 0
09.10.2019, 07:29
    #39873710
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Vivat!SanЕсть такая вьюха - V$PGA_TARGET_ADVICE_HISTOGRAM

как думаешь что значат поля estd_onepass_executions, estd_multipasses_executions?

Давай жги! Что означает?
...
Рейтинг: 0 / 0
09.10.2019, 07:42
    #39873714
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Vivat!Sanчто значат ... estd_Yesterday?
...
Рейтинг: 0 / 0
09.10.2019, 07:54
    #39873717
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometrХуже того, про память я везде натыкаюсь как на условие для hj, одна из таблиц должна вся помешаться в памятьВезде натыкаться не нужно. Есть всего один почти достоверный источник - это документация и там про when the hash table does not fit entirely in the PGA есть упоминания. "Хуже того", с merge join, order by, group by все то же самое.
...
Рейтинг: 0 / 0
09.10.2019, 08:29
    #39873727
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
ElicYesterday?all my troubles seemed so far away...
...
Рейтинг: 0 / 0
09.10.2019, 08:56
    #39873738
Vivat!San
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometr,
Это ты жги, наводку тебе дал куда копать.
...
Рейтинг: 0 / 0
09.10.2019, 11:06
    #39873826
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
-2-golovonometrХуже того, про память я везде натыкаюсь как на условие для hj, одна из таблиц должна вся помешаться в памятьВезде натыкаться не нужно. Есть всего один почти достоверный источник - это документация и там про when the hash table does not fit entirely in the PGA есть упоминания. "Хуже того", с merge join, order by, group by все то же самое.

И? Каков ответ?
...
Рейтинг: 0 / 0
09.10.2019, 11:15
    #39873839
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometrИ? Каков ответ?42
...
Рейтинг: 0 / 0
09.10.2019, 11:27
    #39873844
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
ElicgolovonometrИ? Каков ответ?42
Отличный мудацкий ответ!
...
Рейтинг: 0 / 0
09.10.2019, 11:50
    #39873869
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometrтакая же вода, без явного определения и ответа. Вообще чел спрашивает - верны ли его суждения?
прочитайте не только то сообщение, на которое я дал ссылку, но и ответы на него. там есть есть очень подробный разбор HJ, в т.ч. ссылка на ноту с white paper, в котором всё разжевывается практически побайтово. документ старый, но для общего понимания происходящего сойдёт.
...
Рейтинг: 0 / 0
09.10.2019, 12:15
    #39873885
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometr-2-пропущено...
Везде натыкаться не нужно. Есть всего один почти достоверный источник - это документация и там про when the hash table does not fit entirely in the PGA есть упоминания. "Хуже того", с merge join, order by, group by все то же самое.

И? Каков ответ?
мда.

docs.oracle.comHow Hash Joins Work When the Hash Table Does Not Fit in the PGA
The database must use a different technique when the hash table does not fit entirely in the PGA. In this case, the database uses a temporary space to hold portions (called partitions) of the hash table, and sometimes portions of the larger table that probes the hash table.
golovonometrно все же вопрос из собеседования, оппонент ожидал ответ «если ни одна из таблиц не помещается в памяти hj работать не будет вообще», так ли это? нет, не так.
...
Рейтинг: 0 / 0
09.10.2019, 12:49
    #39873919
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
кит северных морейgolovonometrпропущено...


И? Каков ответ?
мда.

docs.oracle.comHow Hash Joins Work When the Hash Table Does Not Fit in the PGA
The database must use a different technique when the hash table does not fit entirely in the PGA. In this case, the database uses a temporary space to hold portions (called partitions) of the hash table, and sometimes portions of the larger table that probes the hash table.
golovonometrно все же вопрос из собеседования, оппонент ожидал ответ «если ни одна из таблиц не помещается в памяти hj работать не будет вообще», так ли это? нет, не так.

Отлично. Значит оппонент не прав, и hj работать будет. Тогда только остался только один вопрос, где же nl проявит себя лучше?
...
Рейтинг: 0 / 0
09.10.2019, 13:35
    #39873969
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometrТогда только остался только один вопрос, где же nl проявит себя лучше?Юноша, да Вам что в лоб что по лбу. При такой дерзости и неспособности думать дорога в манагеры.

Последняя попытка, супер конерктный пример
Код: plsql
1.
2.
3.
4.
5.
6.
create table t1(id) as
select 1e3 + rownum from dual connect by rownum <= 5;
create table t2(id, constraint pk_t2 primary key (id)) as
select rownum from
(select * from dual connect by rownum <= 1e3),
(select * from dual connect by rownum <= 1e4);


Код: plsql
1.
2.
3.
4.
5.
alter session set statistics_level = all;
select * from t1 join t2 on t1.id = t2.id;
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
select /*+ use_hash(t1 t2) */ * from t1 join t2 on t1.id = t2.id;
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-----------------------------------------------------------------------------------------------
| Id  | Operation          | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |      1 |        |      5 |00:00:00.01 |      16 |      2 |
|   1 |  NESTED LOOPS      |       |      1 |      5 |      5 |00:00:00.01 |      16 |      2 |
|   2 |   TABLE ACCESS FULL| T1    |      1 |      5 |      5 |00:00:00.01 |       4 |      0 |
|*  3 |   INDEX UNIQUE SCAN| PK_T2 |      5 |      1 |      5 |00:00:00.01 |      12 |      2 |
-----------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |      5 |00:00:04.32 |   15237 |       |       |          |
|*  1 |  HASH JOIN         |      |      1 |      5 |      5 |00:00:04.32 |   15237 |  2293K|  2293K|  970K (0)|
|   2 |   TABLE ACCESS FULL| T1   |      1 |      5 |      5 |00:00:00.01 |       3 |       |       |          |
|   3 |   TABLE ACCESS FULL| T2   |      1 |   8986K|     10M|00:00:01.17 |   15234 |       |       |          |
----------------------------------------------------------------------------------------------------------------

Хватит мозгов сделать выводы по приведённым табличкам или всё равно надо разжевать?

PS. У Hash Join ограниченная область приминения. Он может быть использован только для equi join predicates.
...
Рейтинг: 0 / 0
09.10.2019, 16:25
    #39874187
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometrгде же nl проявит себя лучше?
Если коротко, то в oltp.
...
Рейтинг: 0 / 0
09.10.2019, 18:42
    #39874257
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Кобанчег, мега респект! Спасибо большое, значит оппонент прав.
...
Рейтинг: 0 / 0
09.10.2019, 20:14
    #39874301
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometrКобанчег, мега респект! Спасибо большое, значит оппонент прав.вам продемонстрировали выигрыш NL в случае наличия эффективного индексного доступа к присоединяемой таблице. как вы и просили. к теории вашего оппонента это не имеет никакого отношения.
...
Рейтинг: 0 / 0
09.10.2019, 22:36
    #39874335
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
golovonometr Будет ли работать hj когда ни одна из таблиц не помещается в память? Как оракул будет выполнять такой запрос? Включит nl?
сначала прочёл, как говнометр, простите

будет.

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

нет: все равно выгодней hj, даже так через жопу, завесив весь объём памяти базы - тупо быстрее и меньше операций с блоками

ps: Андрею респект - единственный практик в этом треде (без голой теории на примерах).
только практика выветривает из башки всю теоретическую блажь...

головоногометр, бери с него пример - у него есть чему поучиться
...
Рейтинг: 0 / 0
09.10.2019, 22:51
    #39874340
Vivat!San
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Fogelнет: все равно выгодней hj, даже так через жопу, завесив весь объём памяти базы - тупо быстрее и меньше операций с блоками


Кто тебе даст весь объём памяти сервера?
О какой области памяти речь хоть понимаешь?
практик тут нашёлся
...
Рейтинг: 0 / 0
09.10.2019, 23:43
    #39874358
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join на больших таблицах
Fogelпо частям: берётся большая таблица и её часть, сколько влезет в память, сравнивается со второй, потом берётся из второй часть, сравнивается с остатком из первой и так ступенькой, большими кусками отщипывая, будет двигать весь объём
Личные фантазии имело бы смысл излагать, если обладаешь литературно-алгоритмическим талантом. Только теребонькать свой эпистолярий нужно было до указания на наличие описания алгоритма в документации.
Fogelникто не удосужился провести аудит типовых запросов и создать индексы под нихналичие подходящего индекса способстсвует nested loop, но не обязательно делает его эффективнее hash join.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hash join на больших таблицах / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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