@Ryabos

Как clickhouse использует ОЗУ при обработке запроса?

На обработку запроса
select * from my_table limit 10000000 INTO OUTFILE 'test1';
ушло 373 Мб ОЗУ. А если ещё сджойнить маленькую таблицу, то на обработку 10М записей уходит 410 Мб. Если запросить 30 миллионов записей из пересечения таблиц, на обработку уйдёт 430 Мб.

Почему зависимость между запрашиваемым объёмом данных и потребляемой памятью нелинейна? Засчёт чего это достигается? Предположения у меня и у самого есть, но точного ответа я нигде не нашёл, а в исходниках не разобрался.
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Кликхаус относится к классу column-oriented dbms. Это означает что data-row как таковой отсуствует.
Строк нет. Но есть столбцы которые хранятся физически консолидировано. И когда ты указываешь
SELECT * то это заставляет кликхаус сделать гораздо больше действий чем надо на самом деле. В
силу этой колоночатой организации. Сами строки - виртуальны и чтобы их сформировать кликхаус
должен вычитать физических данных гораздо больше чем реляционка. Столбец - больше чем ячейка.

Чтоб такая система работала эффективно ты должен ее грузить аналитическими запросами типа

select avg(amount) from my_table;
Тогда кликхаус сработает быстрее чем Oracle или PG. В силу этой особенности формата.

А то что ты делаешь - экспорт во внешние файлы лучше вообще не делать. Или делать редко
или как-то по другому. Явно это не сильная сторона такой системы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы