279просмотров
11 октября 2025 г.
Score: 307
️⃣ Сортировка, не всё хорошо, что упорядочено! При создании таблицы указывается набор полей по которым данные будут отсортированы и по которым создадутся индексы. ORDER BY (param1, param2, ...., paramN) А что здесь-то интересного:
- кол-во (можно же и 1 и 100500)
- выбор самих параметров (а чего выбирать-то? типы, категории, время, ...)
- взаимное расположение (что за чем должно следовать) А что выбрать:
- обычно выбирают те, поля по которым таблица чаще всего фильтруется (у нас же индексы есть) Кол-во полей:
- в пределах разумного, 3-5. Большое кол-во замедляет вставку + вызывает фоновый процесс мержей (нагружает CPU). Хороший алгоритм для заполнения ORDER BY есть у altinity Как расположить:
- дока говорит, что следует располагать поля по уменьшению кардинальности (то есть поля с меньшим кол-вом уникальных значений должны быть левее, например, пол, ос, страна и др) - это верно, тк при использовании такой фильтрации кол-во читаемых данных уменьшается минимум на 50%
- altinity добавляет: поля наиболее часто используемые при фильтрации следует располагать левее (например, дата) Возникает противоречение: уникальных дней больше чем значений пола, но по дате фильтруются чаще -> в общем случае рекомендация будет такой:
сначала располагаем, что по чему чаще фильтруемся, далее в порядке уменьшения кардинальности, то есть для примера выше ORDER BY (report_date, gender, ....) На самом деле работать может и любая другая комбинация (gender, country, report_date, ...) или еще хуже (gender, country, ...., report_date) - главным критерием является взаимное распределение значений, иными словам:
- за каждый день отчета есть все значения пола и все страны и их распределения между днями не различаются, то вариант с датой, указанной первой - ваш выбор 👍
- а вот если распределение день ото дня различается, то надо ресерчить - готовых решений нет. Можно предложить визуальный пример: данные в файлах сортируются сначала по одному первому атрибуту, после по 2 и тд и при
одной и тоже фильтрации WHERE dt = '2025-10-06' and main = 'Clouds' будет прочитано разное кол-во строк: !clickhouse-notes-order-by.png Выбирайте правильное партиции и верный ORDER BY - и эффективные запросы не заставят себя ждать😉 #clickhouse
#order_by