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

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

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

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

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

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

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

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

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

И? Каков ответ?
...
Рейтинг: 0 / 0
Hash join на больших таблицах
    #39873839
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golovonometrИ? Каков ответ?42
...
Рейтинг: 0 / 0
Hash join на больших таблицах
    #39873844
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicgolovonometrИ? Каков ответ?42
Отличный мудацкий ответ!
...
Рейтинг: 0 / 0
Hash join на больших таблицах
    #39873869
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golovonometrтакая же вода, без явного определения и ответа. Вообще чел спрашивает - верны ли его суждения?
прочитайте не только то сообщение, на которое я дал ссылку, но и ответы на него. там есть есть очень подробный разбор HJ, в т.ч. ссылка на ноту с white paper, в котором всё разжевывается практически побайтово. документ старый, но для общего понимания происходящего сойдёт.
...
Рейтинг: 0 / 0
Hash join на больших таблицах
    #39873885
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hash join на больших таблицах
    #39873919
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей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
Hash join на больших таблицах
    #39873969
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hash join на больших таблицах
    #39874187
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golovonometrгде же nl проявит себя лучше?
Если коротко, то в oltp.
...
Рейтинг: 0 / 0
Hash join на больших таблицах
    #39874257
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег, мега респект! Спасибо большое, значит оппонент прав.
...
Рейтинг: 0 / 0
Hash join на больших таблицах
    #39874301
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golovonometrКобанчег, мега респект! Спасибо большое, значит оппонент прав.вам продемонстрировали выигрыш NL в случае наличия эффективного индексного доступа к присоединяемой таблице. как вы и просили. к теории вашего оппонента это не имеет никакого отношения.
...
Рейтинг: 0 / 0
Hash join на больших таблицах
    #39874335
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golovonometr Будет ли работать hj когда ни одна из таблиц не помещается в память? Как оракул будет выполнять такой запрос? Включит nl?
сначала прочёл, как говнометр, простите

будет.

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

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

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

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


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


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