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

Добрый день, я тут спрашивала, как сделать, чтобы при группировке

по полю с высокой кардинальностью, эта группировка не тратила много оперативки.

Расход RAM у меня был >~10Гб. Собственно и заметила это, т.к. он не вписался в лимит. Расширила лимит, все выполнилась, но тут спросила, как уменьшить использование RAM.

Получила несколько ответов, почитала, все попробовала.

Что-то ничего не получилось :((

В <profiles> прописала

<optimize_aggregation_in_order>1</optimize_aggregation_in_order>.

Для сессии тоже явно указала настройку set optimize_aggregation_in_order=1. На всякий🙈

Старая таблица была создана с index_granularity ~300. Primary key был по полю с наибольшей кардинальностью, а в order by он, и ещё два поля с меньшей кардинальностью, в порядке возрастания кардинальности.

Новую таблицу создала с теми же данными, в order by и primary key указали одни и те же три поля в порядке возрастания кардинальности. index_granularity стандартная.

Выполнила запрос к новой таблице.
Группировку делала только по тем полям, которые указаны и в order by, и в primary key, одни и те же, в порядке возрастания кардинальности.

Ожидаемый результат было, что расход оперативки уменьшится. Реально, он стал 18Гб.

Выполняла из-под кликхаус клиента, чтоб посмотреть, как расходуется память.

Запустила аналогичный запрос к старой таблице. Опять 18Гб.

Сделала группировку только по полю с наибольшей кардинальностью, опять 18Гб.

Может, какие-то ещё настройки влияют?
Влияет ли кол-во строк в таблице?

5 ответов

19 просмотров

Сколько весит у вас таблица ?

Вы видимо не понимаете что optimize помогает только запросам у которых groupby примерно матчится с order by таблицы. Покажите запрос и ddl таблицы partition by orderby

Tatiana Egorova-Egorova Автор вопроса
Константин
Сколько весит у вас таблица ?

первая 3Гб, вторая 5,8Гб. Кол-во строк: 115132713

Tatiana Egorova-Egorova Автор вопроса
Denny [Altinity]
Вы видимо не понимаете что optimize помогает тольк...

Добрый день, это создание таблиц, первоначально и для использования optimize_aggregation_in_order: CREATE TABLE DWH.kv ( region String, b String, account_id String, dt DateTime, f String, g String, h String, i String, j String, k Nullable(Int16), l Nullable(Float32), m Nullable(Float32), n Nullable(Float32), o Nullable(Float32), p Nullable(Float32), q Nullable(Float32), r Nullable(Float32), t Nullable(DateTime), v Nullable(DateTime), u Nullable(Float32), x Nullable(Float32), y String ) ENGINE = MergeTree ORDER BY account_id SETTINGS index_granularity = 370; CREATE TABLE DWH.kv2 ( region String, b String, account_id String, dt DateTime, f String, g String, h String, i String, j String, k Nullable(Int16), l Nullable(Float32), m Nullable(Float32), n Nullable(Float32), o Nullable(Float32), p Nullable(Float32), q Nullable(Float32), r Nullable(Float32), t Nullable(DateTime), v Nullable(DateTime), u Nullable(Float32), x Nullable(Float32), y String ) ENGINE = MergeTree PRIMARY KEY (region, dt, account_id) ORDER BY (region, dt, account_id) SETTINGS index_granularity = 8192; Кол-во строк: 115132713 Кол-во account_id: 6144260 И запросы: select t.region, t.dt, t.account_id "Идентификатор" , max(t.h) "Тип" , sum(t.m) "Начальное сальдо Дебет" , sum(t.n) "Сумма оплачено ИТОГО, руб." , sum(t.o) "Начальное сальдо Кредит" , sum(t.p) "Конечное сальдо Дебет" , sum(t.q) "Конечное сальдо Кредит" , min(t.v) "Дата оплаты по сальдо" from DWH.kv(2) t group by t.region, t.dt, t.account_id ; select t.account_id "Идентификатор" , max(t.h) "Тип" , sum(t.m) "Начальное сальдо Дебет" , sum(t.n) "Сумма оплачено ИТОГО, руб." , sum(t.o) "Начальное сальдо Кредит" , sum(t.p) "Конечное сальдо Дебет" , sum(t.q) "Конечное сальдо Кредит" , min(t.v) "Дата оплаты по сальдо" from DWH.kv(2) t group by t.account_id ; В обоих запросах, не зависимо от полей группировки: system.query_log: Settings: {load_balancing=random, max_memory_usage=107374182400, optimize_aggregation_in_order=1}

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта