LIMIT

Ещё раз посмотрим на нашу таблицу:

SELECT * FROM m_students.v_students_light_1 LIMIT 1;
Потребление памяти

Для отображения одной строки кликхаус прочел с диска 1 строку. Вроде бы все логично. Но посмотрим такой пример:

SELECT * FROM m_students.v_students_light_1 LIMIT 8192;
SELECT * FROM m_students.v_students_light_1 LIMIT 8193;
Обратите внимание на количество прочитанных строк

Это связано с тем, что индекс в ClickHouse разреженный и его гранулярность определяется настройкой index_granularity, которая указывается при создании таблицы (подробнее здесь)

По умолчанию и в нашем примере, показатель равен 8192 и это значит, что ClickHouse читает данные порциями, по гранулам — по 8192 строк.

Но как ClickHouse удалось прочитать одну строку при использовании LIMIT 1?

При использовании LIMIT ClickHouse может остановить чтение данных, как только найдет первую строку, удовлетворяющую запросу, даже при высокой гранулярности индекса. Это происходит благодаря работе внутреннего оптимизатора ClickHouse. Но, как мы видим, при запросе более 8192 строк с диска сразу считывается две гранулы полностью, т.е. 16 384 строки

Выводы

  • Пользуйтесь LIMIT, если это возможно. Это существенно сокращает ресурсы.

  • Помните о гранулярности индекса. Обращайте внимание на DDL таблиц, которыми пользуетесь

Last updated