powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / 3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
10 сообщений из 10, страница 1 из 1
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38727752
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> recreate table tn(x int); commit; set planonly;

SQL> select * from (select x a from tn) r join (select x b from tn) s on r.a = s.b;

PLAN HASH (S TN NATURAL, R TN NATURAL) -- гут


SQL> select * from (select cast(rand()*100 as int) a from tn) r join (select cast(rand()*100 as int) b from tn) s on r.a = s.b;

PLAN JOIN (R TN NATURAL, S TN NATURAL) -- хм... что помешало тут применить HJ ?


SQL> select * from (select cast( 0*x+ rand()*100 as int) a from tn) r join (select cast( 0*x+ rand()*100 as int) b from tn) s on r.a = s.b;

PLAN HASH (S TN NATURAL, R TN NATURAL) -- снова гут


SQL> select * from (select cast( 0*x +rand()*100 as int) a from tn) r join (select cast(rand()*100 as int) b from tn) s on r.a = s.b;

PLAN JOIN (R TN NATURAL, S TN NATURAL) -- снова "хм..."

Оптимизатор перед тем, как решить, как соединять, "подглядывает" внутрь источников и если видит, что в одной из частей соединения нет "настоящих полей", отказывается от HJ. Это так и было задумано ?
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38727754
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще. Как его вообще заставить применить HJ, когда соединяем по rdb$db_key ?

Код: plaintext
1.
2.
3.
4.
5.
6.
SQL> select * from (select rdb$db_key a from tn) r join (select rdb$db_key b from tn) s on r.a||'' = s.b;

PLAN JOIN (S TN NATURAL, R TN INDEX ())

SQL> select * from (select rdb$db_key||'' a from tn) r join (select rdb$db_key||'' b from tn) s on r.a||'' = s.b||'';

PLAN JOIN (R TN NATURAL, S TN NATURAL)
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38727957
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

в трекер занеси
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38727988
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для dbkey точно недоработка. А вот для первых примеров я не уверен. В отличие от NLJ, HJ/MJ вычисляют условие соединения несколько раз. При твоем любимом rand может получиться так, что джойн никогда не вернет ни одной записи.
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38728014
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,
Вопрос не совсем в тему, но таки спрошу, потому как и HJ не помогает.
Есть inner join 2-х таблиц. В поле соединения много null-ов. Для простоты можно рассмотреть джойн таблицы самой с собой, где данных 10% по сравнению с null-ами. Если соединять без условий, то запрос работает долго. Если на первую таблицу дать not null, то значительно быстрее. Получается много стрельбы холостыми? Если переписать через вложенный for select то получается тоже самое. Планируются ли оптимизации в этом ключе?
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38728031
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrдля dbkey точно недоработка. А вот для первых примеров я не уверен. В отличие от NLJ, HJ/MJ вычисляют условие соединения несколько раз. При твоем любимом rand может получиться так, что джойн никогда не вернет ни одной записи.В трекер добавил, CORE-4528

А что касается rand(), то всё также грустно и при наличии констант (и отсутствии ссылок на поля таблиц):
Код: plaintext
1.
2.
SQL> select * from (select 1 a from tn) r join (select 1 b from tn) s on r.a = s.b;

PLAN JOIN (R TN NATURAL, S TN NATURAL)
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38728210
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

давай конкретику - сколько в секундах и в фетчах "долго" и сколько "значительно быстрее". Поле связи индексировано?
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38728233
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrдавай конкретику - сколько в секундах и в фетчах "долго" и сколько "значительно быстрее". Поле связи индексировано?
Код: sql
1.
2.
select count(*) from MS2008_TABLES_FIELDS F1
  inner join MS2008_TABLES_FIELDS F2 on F1.defname = F2.defname


15s 538ms
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
COUNT
76071

------ Performance info ------
Prepare time = 0ms
Execute time = 15s 538ms
Avg fetch time = 15 538,00 ms
Current memory = 557 312 224
Max memory = 557 647 744
Memory buffers = 32 768
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 606 267

Plan
------------------------------------------------
PLAN JOIN (F1 NATURAL, F2 INDEX (MS2008_TABLES_FIELDS_IDX4))

Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 15 538,00 ms
Avg fetch time: 15 538,00 ms

Memory
------------------------------------------------
Current: 557 312 224
Max    : 557 647 744
Buffers: 32 768

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 606 267
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|MS2008_TABLES_FIELDS           |         0 |     76071 |       41682 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

Код: sql
1.
2.
3.
select count(*) from MS2008_TABLES_FIELDS F1
  inner join MS2008_TABLES_FIELDS F2 on F1.defname = F2.defname
  where f1.defname is NOT NULL


265ms
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
COUNT
76071

------ Performance info ------
Prepare time = 15ms
Execute time = 265ms
Avg fetch time = 265,00 ms
Current memory = 557 315 736
Max memory = 557 647 744
Memory buffers = 32 768
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 257 217

Plan
------------------------------------------------
PLAN JOIN (F1 NATURAL, F2 INDEX (MS2008_TABLES_FIELDS_IDX4))

Query Time
------------------------------------------------
Prepare       : 15,00 ms
Execute       : 265,00 ms
Avg fetch time: 265,00 ms

Memory
------------------------------------------------
Current: 557 385 304
Max    : 557 647 744
Buffers: 32 768

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 257 217
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|MS2008_TABLES_FIELDS           |         0 |     76071 |       41682 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE MS2008_TABLES_FIELDS (
 ...
    DEFNAME          VARCHAR(128),
 ...
);

CREATE INDEX MS2008_TABLES_FIELDS_IDX4 ON MS2008_TABLES_FIELDS (DEFNAME);


select count(*) from MS2008_TABLES_FIELDS F1
---
COUNT
41682

select count(*) from MS2008_TABLES_FIELDS F1 where F1.defname is not null
---
COUNT
6777
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38728325
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

хороший пример, спасибо. Можно попробовать оптимизировать, заноси в трекер.
...
Рейтинг: 0 / 0
3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
    #38728526
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

CORE-4531
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / 3.0: hash join не применяется, если в левой или правой частях условия нет полей *таблиц* ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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