|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Как известно есть три основных типа выполнения 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 14:04 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
А куда это в оценке merge делась сортировка?.. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 14:39 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Ну предполагается что там индексы есть, потому как иначе hash join лучше. Но вообще пусть будет A(logA+1) + B(logB+1) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 14:46 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Скорее откуда это в HASH взялась сортировка? И в какой СУБД у вас выпадает в Nested loop? Статистика актуальна по индексам по которым идет соединение? Какое кол-во записей в каждой из двух таблиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 14:48 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
вообще говоря, циклы - самый "лёгкий" для ресурсов способ объединения и хэш, и мердж требуют порядочных накладных расходов но, если кому не нравится - тот всегда может использовать хинты или план-гайды ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 15:15 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Bond_JamesBondНу предполагается что там индексы есть, потому как иначе hash join лучше. Да неужели? Доступ по индексу вообще-то дороже сортировки из-за рандомного чтения... Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 15:25 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Статистика, В PostgreSQL. Индексы актуальны, там естественно ошибка в сложном случае, когда в подзапросе идет группировка на сумму, а потом фильтруется что эта сумма null, оптимизатор при actual 393 считает что запись 1, и из-за nested loop join'ов цепочкой разворачивает реальное выполнение в 20 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 15:35 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Опять-таки рандомное чтение это некоторые весьма статичные затраты. То есть если у меня в запросе везде задействовано по 300 записей, то выполнение за пределы допустимого никак не выйдет. А с nested loop'ом 3 раза "умножит" и будет 27'000'000 операций и приехали. Я понимаю это критично когда 2к юзеров и несложная функциональность, но скажем когда <20 юзеров и наоборот сложные запросы, то тогда гораздо хуже когда СУБД в клинч уходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 15:39 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
что-то я не понимаю, как при циклах с индексами у нас происходит умножение к-ва записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 15:42 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
locky, Код: plaintext 1. 2. 3. 4. 5. 6.
Сколько по вашему i будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 15:47 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Bond_JamesBondlocky, Код: plaintext 1. 2. 3. 4. 5. 6.
Сколько по вашему i будет? так индексы вроде есть, не? :) для вложенного цикла ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 16:24 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
У PostgreSQL нету IOS, так что даже при покрывающих индексах merge у него тоже будет с рандомным чтением. Указывай хинт для использования hash join. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 18:47 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Bond_JamesBondМожет кто подскажет в каких СУБД есть возможность, сказать использовать NESTED LOOP, только когда оптимизатор на 110% уверен что в таблице мало записей. А не в стиле вот у меня тут подзапрос с группировкой В том же MSSQL можно задать хинт. Или перед выполнением запроса пересчитать статистику по таблицам, тогда у оптимизатора будут верные на 99% данные) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2011, 12:22 |
|
"Фатальный" Nested Loop Join
|
|||
---|---|---|---|
#18+
Bond_JamesBondМожет кто подскажет в каких СУБД есть возможность, сказать использовать NESTED LOOP, только когда оптимизатор на 110% уверен что в таблице мало записей. А не в стиле вот у меня тут подзапрос с группировкой Мало записей - оно не совсем всегда в кассу, поскольку NESTED LOOP позволяет выдать первые записи быстро. И соответственно, быстро заполнить видимую первую страницу даже если данных много. Ну а так как бы Вы хотите несколько странного. С тем же успехом NL может быть единственным выбором, если на сервере не хватает памяти. И если всё это и всё прочее попытаться сформулировать... собственно и получается оптимизатор. Возможность сказать... мне так помнится, в старых ораклах можно быть регулировать склонность выбирать NL, задавая параметры, определяющие сравнительную привлекательность многоблочного и одноблочного чтения (INDEX_COST_ADJ_чеготовэтомроде). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2011, 00:06 |
|
|
start [/forum/topic.php?fid=35&msg=37414710&tid=1552647]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 240ms |
total: | 377ms |
0 / 0 |