powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / "Фатальный" Nested Loop Join
15 сообщений из 15, страница 1 из 1
"Фатальный" Nested Loop Join
    #37414626
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как известно есть три основных типа выполнения join'ов, nested loop, hash и merge.

У первого сложность A*B, у второго (A (+ B если требуется сортировка))* log B, у третьего A + B.

Соответственно у последних 2-х сложность линейная, у 1-го полиномиальная. 1-й нужен для того чтобы сократить накладные расходы (по сравнению с хэшем), но обратная сторона его, когда оптимизатор сильно не угадывает количество рядов, то запрос просто вешается.

Соответственно СУБД сплошь и рядом нарушают один из основных принципов алгоритмистики (когда сложность алгоритма ставится во главу угла, а экономия на спичках игнорируется). И поэтому становятся непредсказуемыми. (недавно нарвался на такую ситуацию)

Может кто подскажет в каких СУБД есть возможность, сказать использовать NESTED LOOP, только когда оптимизатор на 110% уверен что в таблице мало записей. А не в стиле вот у меня тут подзапрос с группировкой

ЗЫ: Естественно во всяких oracle'ах можно играть dynamic sampling'ом, но что-то мне подсказывает что в моем случае накладные расходы от него (как и вообще всего oracle'а) превысят тупое отрубание nested loop.
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414645
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А куда это в оценке merge делась сортировка?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414654
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну предполагается что там индексы есть, потому как иначе hash join лучше.

Но вообще пусть будет A(logA+1) + B(logB+1)
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414655
Скорее откуда это в HASH взялась сортировка?

И в какой СУБД у вас выпадает в Nested loop? Статистика актуальна по индексам по которым идет соединение? Какое кол-во записей в каждой из двух таблиц?
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414675
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще говоря, циклы - самый "лёгкий" для ресурсов способ объединения
и хэш, и мердж требуют порядочных накладных расходов

но, если кому не нравится - тот всегда может использовать хинты или план-гайды
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414686
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBondНу предполагается что там индексы есть, потому как иначе hash join лучше.

Да неужели? Доступ по индексу вообще-то дороже сортировки из-за рандомного чтения...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414698
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Статистика,

В PostgreSQL. Индексы актуальны, там естественно ошибка в сложном случае, когда в подзапросе идет группировка на сумму, а потом фильтруется что эта сумма null, оптимизатор при actual 393 считает что запись 1, и из-за nested loop join'ов цепочкой разворачивает реальное выполнение в 20 сек.
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414701
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Опять-таки рандомное чтение это некоторые весьма статичные затраты. То есть если у меня в запросе везде задействовано по 300 записей, то выполнение за пределы допустимого никак не выйдет. А с nested loop'ом 3 раза "умножит" и будет 27'000'000 операций и приехали.

Я понимаю это критично когда 2к юзеров и несложная функциональность, но скажем когда <20 юзеров и наоборот сложные запросы, то тогда гораздо хуже когда СУБД в клинч уходит.
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414704
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то я не понимаю, как при циклах с индексами у нас происходит умножение к-ва записей.
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414710
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky,

Код: plaintext
1.
2.
3.
4.
5.
6.
 int  i= 0 ;
 for (A a : as)
    for (B b : bs)
       i++;
 return  i;


Сколько по вашему i будет?
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414733
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBondlocky,

Код: plaintext
1.
2.
3.
4.
5.
6.
 int  i= 0 ;
 for (A a : as)
    for (B b : bs)
       i++;
 return  i;


Сколько по вашему i будет?
так индексы вроде есть, не? :)
для вложенного цикла
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37414790
У PostgreSQL нету IOS, так что даже при покрывающих индексах merge у него тоже будет с рандомным чтением. Указывай хинт для использования hash join.
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37415028
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBondМожет кто подскажет в каких СУБД есть возможность, сказать использовать NESTED LOOP, только когда оптимизатор на 110% уверен что в таблице мало записей. А не в стиле вот у меня тут подзапрос с группировкой

В том же MSSQL можно задать хинт.

Или перед выполнением запроса пересчитать статистику по таблицам, тогда у оптимизатора будут верные на 99% данные)
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37415389
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBondМожет кто подскажет в каких СУБД есть возможность, сказать использовать NESTED LOOP, только когда оптимизатор на 110% уверен что в таблице мало записей. А не в стиле вот у меня тут подзапрос с группировкой
Мало записей - оно не совсем всегда в кассу, поскольку NESTED LOOP позволяет выдать первые записи быстро. И соответственно, быстро заполнить видимую первую страницу даже если данных много.

Ну а так как бы Вы хотите несколько странного. С тем же успехом NL может быть единственным выбором, если на сервере не хватает памяти. И если всё это и всё прочее попытаться сформулировать... собственно и получается оптимизатор.

Возможность сказать... мне так помнится, в старых ораклах можно быть регулировать склонность выбирать NL, задавая параметры, определяющие сравнительную привлекательность многоблочного и одноблочного чтения (INDEX_COST_ADJ_чеготовэтомроде).
...
Рейтинг: 0 / 0
"Фатальный" Nested Loop Join
    #37415696
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Если серверу не хватает памяти, пусть он лучшее ее подождет, ему же все равно вешаться... :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / "Фатальный" Nested Loop Join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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