powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hash join, как работает хеширование с индексом.
10 сообщений из 10, страница 1 из 1
Hash join, как работает хеширование с индексом.
    #40075368
Gertf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Не могу найти информацию как происходит хеширование при join.
Если на поле иметься индекс он будет хешировать его или не будет обращать внимание и начнет хешировать по таблице.
...
Рейтинг: 0 / 0
Hash join, как работает хеширование с индексом.
    #40075393
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для join - индекс никак НЕ поможет
Для чтения/извлечения данных из таблицы - будет взят наиболее дешевый способ. Если в индексе есть все необходимые поля, то вместо извлечения данных из таблицы, возможно будет использоваться индекс.

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

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

Ok. В каких случаях оптимизатор способен выбрать hash join с хэш-таблицей, созданной из
индекса, вместо merge join/nested loop c index scan?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Hash join, как работает хеширование с индексом.
    #40075410
Gertf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
В принципе я с вами согласен, но меня смущает что стоимость с 322к с индексом увеличивается до 36кк, при принудительном его выключении путем конкатенации доп символа при связывание.
...
Рейтинг: 0 / 0
Hash join, как работает хеширование с индексом.
    #40075413
Gertf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
быстрее всего звучит это хеширование изначений индекса, а не чтение всей таблицы.
...
Рейтинг: 0 / 0
Hash join, как работает хеширование с индексом.
    #40075419
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hash join, как работает хеширование с индексом.
    #40075423
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А без искусственного форса метода?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Hash join, как работает хеширование с индексом.
    #40075430
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Hash join, как работает хеширование с индексом.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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