184 похожих чатов

Всем привет! Получаю ошибку: Code: 241, e.displayText() = DB::Exception: Memory limit

(for query) exceeded
Версия 19.3.5

Запрос вида:
SELECT /* fields */
FROM (
SELECT some_id1, some_id2, max(publish_seq_id) as psi
FROM tbl
WHERE /* conditions */
GROUP BY some_id1, some_id2
) i
INNER JOIN tbl t
ON t.some_id1 = i.some_id1
AND t.some_id2 = i.some_id2
AND t.publish_seq_id = i.psi
WHERE /* same conditions as above */
ORDER BY ...
LIMIT x OFFSET yINNER JOIN такого вида задумывался для дедупликации записей в ReplicatedReplacingMergeTree в момент, когда схлопывание ещё не произошло. Сам запрос делается из Distributed таблицы, использующий эти реплицированные.

Ошибка возникает даже когда считанные единицы или вообще ноль записей удовлетворяет условиям.

Подскажите, пожалуйста, ответы на вопросы:
1. Это у меня подход с JOIN не соответствует архитектуре БД?
2. Можно ли ошибку исправить апгрейдом версии сервера?
3. Или построением каких-то индексов?
4. Или может для данной цели (выборка с дедупликацией) есть какой-то более штатный/общеиспользуемый подход?

4 ответов

7 просмотров

может быть поможет INNER JOIN ( SELECT FROM tbl WHERE… )

1. выбирать левой надо более крупную таблицу, 2. пушдаун есть, но не всегда работает 3. для фильтрации дублей в ReplacingMergeTree есть SEMI LEFT JOIN (в старом синтаксисе ANY INNER - это если с выставленным any_join_distinct_right_table_keys) - он не размножает дубли как обычный INNER JOIN, поэтому работает быстрее P.S. но в конкретном случае (фильтрации крупной таблицы самой по себе с пэйджинком) этого будет не достаточно - правая таблица все равно не влезет в память, засуньте LIMIT в подзапрос для правой таблицы SEMI LEFT JOIN

>> задумывался для дедупликации записей по своему опыту скажу, что делать джойны для исправления этой особенности КХ - плохая идея Варианты: - делать optimize table final перед единичными чтениями, если возможно - делать limit 1 by "ключ" с правильной сортировкой - не делать ничего, осознавая что могут быть временные неточности из-за этого ЗЫ В последней версии должны были добавить возможность скидывать на диск тяжелые джойны (по аналогии с тем, что есть для group by), но не знаю добавили ли. Но это тоже не вариант для этой цели

SELECT some_id1, some_id2, argMax(tuple(*),publish_seq_id) FROM tbl WHERE /* conditions */ GROUP BY some_id1, some_id2

Похожие вопросы

Обсуждают сегодня

кому не сложно распишите пожалуйста для какой цели тут вот эти скобки и в них пихается указатель?
Михаил Helper
15
Комрады, посоветуйте, куда копать? Стал прикручивать кастомизацию тем. В OnShow главной главной формы пытаюсь загрузить из файла настроек и применить тему (на скрине, как долж...
Ed Doc
13
Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
OnShow один раз вызывается? или возможен Hide?
Iluha Companets
14
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
Всем привет! Можете порекомендовать датасет для детекции/сегментации высокого качества (картинки высокого разрешения 768x768+, c большим разнообразием сцен, т.е. не только авт...
Andrei Filatov
4
Карта сайта