powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
7 сообщений из 32, страница 2 из 2
FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
    #38512657
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полуофф.
А для внешнего соединения HJ будет реализован ? А то сейчас вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select count(*) from tm m LEFT join td d on m.x+0=d.x+0;

Select Expression
    -> Aggregate
        ->  Nested Loop Join (outer)
            -> Table "M" Full Scan
            -> Filter
                -> Table "D" Full Scan
- и "ку-ку".

А ведь тут всё просто:
Код: 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.
SQL> select count(*) from (select m.* from tm m join td d on m.x+0=d.x+0 union distinct select m.* from tm m);

Select Expression
    -> Aggregate
        -> Sort (unique)
            -> Union
                -> Filter
                    -> Hash Join (inner)
                        -> Table "D" Full Scan
                        -> Record Buffer
                            -> Table "M" Full Scan
                -> Table "M" Full Scan

                COUNT
=====================
                  253

Current memory = 2450751584
Delta memory = 4480
Max memory = 2453993504
Elapsed time= 8.28 sec
Cpu = 0.00 sec
Buffers = 524288
Reads = 15572
Writes = 0
Fetches = 2556261
...
Рейтинг: 0 / 0
FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
    #38512658
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

когда-нибудь будет
...
Рейтинг: 0 / 0
FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
    #38512811
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrкогда-нибудь будет

В смысле когда-нибудь. Разве это в тройке не запланировано? В одной из презентаций по fb3 я точно видел планы Hash/Merge outer join. И ещё там группировка хэшированием была.
...
Рейтинг: 0 / 0
FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
    #38512824
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

ты тройку хочешь в следующем году или еще через пару лет? Из планов сделаем то, что успеем, не более того.
...
Рейтинг: 0 / 0
FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
    #38512839
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrты тройку хочешь в следующем году или еще через пару лет?

в следующем было бы хорошо, но наверно это слишком оптимистично.

dimitrИз планов сделаем то, что успеем, не более того.

и на том спасибо. Может тогда в 3.1 хоть будет.
...
Рейтинг: 0 / 0
FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
    #38513228
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решился я всё таки на погружение в Optimizer.cpp :-)
И вижу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
double OPT_getRelationCardinality(thread_db* tdbb, jrd_rel* relation, const Format* format)
{
	SET_TDBB(tdbb);

	if (relation->isVirtual())
	{
		// Just a dumb estimation
		 return (double) 100; 
	}

	if (relation->rel_file)
	{
		return EXT_cardinality(tdbb, relation);
	}

	MET_post_existence(tdbb, relation);
	const double cardinality =  DPM_cardinality(tdbb, relation, format); 
	MET_release_existence(tdbb, relation);
	return cardinality;
}

ВОПРОС-1. Что такое "relation->isVirtual()" ? Это любая derived table или еще что-то ?

ВОПРОС-2. Иду в dpm.epp:
Код: plaintext
1.
2.
3.
4.
5.
double DPM_cardinality(thread_db* tdbb, jrd_rel* relation, const Format* format)
{
. . .
	return (double) dataPages * (dbb->dbb_page_size - DPG_SIZE) /
		(minRecordSize + (format->fmt_length * 0.5));
}
DPG_SIZE - это что ?
minRecordSize = 17 байт (заголовок записи) или плюсовать сюда еще что-то ?
format->fmt_length = сумма декларированных длин varchar-полей + фиксированных длин прочих типов (int, date) - так ?

И вопрос-3 : http://www.ibase.ru/devinfo/dataaccesspaths.htm#chapter311 Из всех возможных перестановок выбирается вариант с наименьшей стоимостью. В процессе перебора вариантов отбрасываются заведомо худшие (на основании уже имеющейся стоимостной информации).- где этот перебор делается, как называется соотв. ф-ция ? И ограничен ли перебор каким-то значением ? Например, я вчера сбацал запрос, в котором таблица самоджойнилась 254 раза - и он составил план всего за 3 сек. Понятно, что никаким прямым перебором на основе оценки стоимости перестановок он так сделать бы не смог.
...
Рейтинг: 0 / 0
FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
    #38513252
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если уж полез, то разбирайся сам. Я не собираюсь тут разжевывать исходники ради непонятного любопытства.
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB-3 hash join: какая эвристика заставляет его (не) применять при соединении таблиц ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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