Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hash join, как работает хеширование с индексом. / 10 сообщений из 10, страница 1 из 1
03.06.2021, 11:27
    #40075368
Gertf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
Добрый день.
Не могу найти информацию как происходит хеширование при join.
Если на поле иметься индекс он будет хешировать его или не будет обращать внимание и начнет хешировать по таблице.
...
Рейтинг: 0 / 0
03.06.2021, 13:19
    #40075393
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
Для join - индекс никак НЕ поможет
Для чтения/извлечения данных из таблицы - будет взят наиболее дешевый способ. Если в индексе есть все необходимые поля, то вместо извлечения данных из таблицы, возможно будет использоваться индекс.

IMHO & AFAIK
...
Рейтинг: 0 / 0
03.06.2021, 13:24
    #40075398
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
hash join и индексы - вещь взаимоисключающая. Он применяется когда индексов нет или они
бесполезны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.06.2021, 13:31
    #40075403
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
Dimitry Sibiryakov

hash join и индексы - вещь взаимоисключающая.
Неправда.
...
Рейтинг: 0 / 0
03.06.2021, 13:38
    #40075406
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
AmKadНеправда.

Ok. В каких случаях оптимизатор способен выбрать hash join с хэш-таблицей, созданной из
индекса, вместо merge join/nested loop c index scan?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.06.2021, 13:43
    #40075410
Gertf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
Leonid Kudryavtsev,
В принципе я с вами согласен, но меня смущает что стоимость с 322к с индексом увеличивается до 36кк, при принудительном его выключении путем конкатенации доп символа при связывание.
...
Рейтинг: 0 / 0
03.06.2021, 13:45
    #40075413
Gertf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
быстрее всего звучит это хеширование изначений индекса, а не чтение всей таблицы.
...
Рейтинг: 0 / 0
03.06.2021, 14:28
    #40075419
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
Dimitry Sibiryakov

Ok. В каких случаях оптимизатор способен выбрать hash join с хэш-таблицей, созданной из
индекса, вместо merge join/nested loop c index scan?
Leonid Kudryavtsev
Если в индексе есть все необходимые поля, то вместо извлечения данных из таблицы, возможно будет использоваться индекс.
для двух таблиц
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
drop table t1 purge;
drop table t2 purge;

create table t1 as
select 
rownum pk_id,
trunc(rownum / 100) fk_id,
dbms_random.string('p',  10) str_brief,
dbms_random.string('p', 100) str_long
from dual
connect by level <= 100000;

create table t2 as select * from t1;

create index t1#fk_id on t1(fk_id, pk_id, str_brief);

create index t2#fk_id on t2(fk_id, pk_id, str_brief);

explain plan for
select /*+ use_hash(t1 t2) */ t1.fk_id, t1.str_brief, t2.fk_id, t2.str_brief
from t1, t2
where t1.pk_id = t2.pk_id
and t1.fk_id = 100 and t2.fk_id = 100;

select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 980946122

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |   100 |  4000 |     4   (0)| 00:00:01 |
|*  1 |  HASH JOIN        |          |   100 |  4000 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN| T1#FK_ID |   100 |  2000 |     2   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN| T2#FK_ID |   100 |  2000 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("T1"."PK_ID"="T2"."PK_ID")
   2 - access("T1"."FK_ID"=100)
   3 - access("T2"."FK_ID"=100)

17 rows selected

для одной таблицы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
drop table t3 purge;

create table t3 as 
select 
rownum id,
trunc(rownum / 1000) fk1_id,
mod  (rownum , 1000) fk2_id,
dbms_random.string('p',  10) str_brief,
dbms_random.string('p', 100) str_long
from dual
connect by level <= 100000;

create index t3#fk1_id on t3(fk1_id);
create index t3#fk2_id on t3(fk2_id);

explain plan for
select /*+ index_join(t3 t3#fk1_id t3#fk2_id) */ fk1_id, fk2_id
from t3
where fk1_id = 100 and fk2_id = 200;

select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2358203619

--------------------------------------------------------------------------------
| Id  | Operation          | Name             | Rows  | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                  |     1 |     7 |     3   (0)| 00:
|*  1 |  VIEW              | index$_join$_001 |     1 |     7 |     3   (0)| 00:
|*  2 |   HASH JOIN        |                  |       |       |            |
|*  3 |    INDEX RANGE SCAN| T3#FK2_ID        |     1 |     7 |     1   (0)| 00:
|*  4 |    INDEX RANGE SCAN| T3#FK1_ID        |     1 |     7 |     2   (0)| 00:
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("FK2_ID"=200 AND "FK1_ID"=100)
   2 - access(ROWID=ROWID)
   3 - access("FK2_ID"=200)
   4 - access("FK1_ID"=100)

19 rows selected

...
Рейтинг: 0 / 0
03.06.2021, 14:42
    #40075423
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
А без искусственного форса метода?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.06.2021, 15:02
    #40075430
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hash join, как работает хеширование с индексом.
Dimitry Sibiryakov

А без искусственного форса метода?..

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
alter system flush shared_pool;

drop table t5 purge;
drop table t6 purge;

create table t5 as
select 
rownum pk_id,
trunc(rownum / 100) fk_id,
dbms_random.string('p',  10) str_brief,
dbms_random.string('p', 100) str_long
from dual
connect by level <= 100000;

create table t6 as select * from t5;

create index t5#fk_id on t5(fk_id, pk_id, str_brief);

create index t6#fk_id on t6(fk_id, pk_id, str_brief);

explain plan for
select t5.fk_id, t5.str_brief, t6.fk_id, t6.str_brief
from t5, t6
where t5.pk_id = t6.pk_id
and t5.fk_id = 100 and t6.fk_id = 100;

select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2200657797

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |   100 |  4000 |     4   (0)| 00:00:01 |
|*  1 |  HASH JOIN        |          |   100 |  4000 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN| T5#FK_ID |   100 |  2000 |     2   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN| T6#FK_ID |   100 |  2000 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("T5"."PK_ID"="T6"."PK_ID")
   2 - access("T5"."FK_ID"=100)
   3 - access("T6"."FK_ID"=100)

Note
-----

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
   - this is an adaptive plan

21 rows selected



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
alter system flush shared_pool;

drop table t4 purge;

create table t4 as 
select 
rownum id,
trunc(rownum / 1000) fk1_id,
mod  (rownum , 1000) fk2_id,
dbms_random.string('p',  10) str_brief,
dbms_random.string('p', 100) str_long
from dual
connect by level <= 100000;

create index t4#fk1_id on t4(fk1_id);
create index t4#fk2_id on t4(fk2_id);

explain plan for
select fk1_id, fk2_id
from t4
where fk1_id = 100 and fk2_id = 200;

select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1544695100

--------------------------------------------------------------------------------
| Id  | Operation          | Name             | Rows  | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                  |     1 |     7 |     3   (0)| 00:
|*  1 |  VIEW              | index$_join$_001 |     1 |     7 |     3   (0)| 00:
|*  2 |   HASH JOIN        |                  |       |       |            |
|*  3 |    INDEX RANGE SCAN| T4#FK2_ID        |     1 |     7 |     1   (0)| 00:
|*  4 |    INDEX RANGE SCAN| T4#FK1_ID        |     1 |     7 |     2   (0)| 00:
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("FK2_ID"=200 AND "FK1_ID"=100)
   2 - access(ROWID=ROWID)
   3 - access("FK2_ID"=200)
   4 - access("FK1_ID"=100)

19 rows selected
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hash join, как работает хеширование с индексом. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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