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

Всем привет! Есть такой запрос: SELECT column1,

column2,
MAX(date) AS maxdate,
multiIf (toTime(maxdate) > toTime(toDateTime('2021-01-01 18:00:00')), toDate(maxdate + toIntervalDay(1)), toDate(maxdate)) AS DPDate
FROM db.table1
WHERE column1 IN ('abc', 'qwe', 'ups')
GROUP BY
column1,
column2

И он выполняется больше 200 секунд, как его максимально ускорить индексами, партициями или ещё чем нибудь? При создании таблицы указывалось только:
PRIMARY KEY date
ORDER BY date
SETTINGS index_granularity = 8192;

Если указать:
ORDER BY date, column1
то он уже выполняется 180 сек, но это всё ещё очень много, хотелось бы 30-40. column2 нельзя указать в order by, потому что Nullable :)

26 ответов

28 просмотров

Попробуй: - LowCardinality(data_type) для column1 и column2 если они не имеют больше 100К уникальных записей в партиции - не используй Nullable - конвертни колонку и пользуйся дефолтным значением - максимально ограничивай диапазон по колонке date. - сделай партицианирование

Кирилл-Дикалин Автор вопроса
Crispy
Попробуй: - LowCardinality(data_type) для column1 ...

Проверю, но скорее всего column1 и column2 имеют больше 100К уникальных записей. Nullable убрал ) Что ты имел в виду под ограничением диапазона по колонке data? Партиционирование по любой колонке выдаёт: DB::Exception: Too many partitions for single INSERT block (more than 100)

Кирилл Дикалин
Проверю, но скорее всего column1 и column2 имеют б...

Зачем по любой, по дате надо Я бы так пробовал PARTITION BY toYYYYMM(date) ORDER BY column1, column2, date

Кирилл Дикалин
Вот как раз так и пробовал

Вы сразу за много месяцев пытаетесь вставить данные?

Кирилл Дикалин
Проверю, но скорее всего column1 и column2 имеют б...

Партицианирование делается по колонке дата по месяцам, а ограничение по времени (например тебе не надо все значения получать и ты делаешь date BETWEEN ‘2021-1101’ AND NOW()

Кирилл-Дикалин Автор вопроса

Всем привет! Был вопрос про оптимизацию запроса, теперь указав следующие параметры: ORDER BY (column1, column2, date) PARTITION BY toYYYYMM(date) SETTINGS index_granularity = 65536, index_granularity_bytes = 83886080 Запрос выполняется 30 секунд вместо 240, что всё ещё довольно много. Индекс гранулярности был подобран экспериментально путём создания десятков разных таблиц и сотен запросов. Скажите, я могу указать ещё какие-нибудь параметры чтобы запрос выполнялся <1 секунду?

Кирилл Дикалин
Всем привет! Был вопрос про оптимизацию запроса, т...

а сколько у вас данных вообще? какие сервера? settings optimize_aggregation_in_order = 1 пробовали? возможно вам проще mat view сделать для оптимизации

Кирилл-Дикалин Автор вопроса
Konstantin Ilchenko
а сколько у вас данных вообще? какие сервера? sett...

Если считать только эти колонки, где то 8 гб, 1,1 млрд строк Сервер в Managed Service for ClickHouse в Яндекс Облаке: IOPS - Чтение 300, Запись 900. Максимальная пропускная способность - Чтение 90 МБ/с, Запись 90 МБ/с. 2 ядра и 8 Гб памяти. optimize_aggregation_in_order делает запрос медленнее Вьюшка не поможет, потому-что запросы разные будут в эту таблицу а этот как пример просто.

Кирилл Дикалин
Если считать только эти колонки, где то 8 гб, 1,1 ...

Раз вьха не поможет, то юзайте проэкции, чтобы оптимизировать выбранные запросы. Все запросы не оптимизировать, но приблизиться к оптимальной схеме вполне реально.

Кирилл-Дикалин Автор вопроса
Vladimir Goncharov
Раз вьха не поможет, то юзайте проэкции, чтобы опт...

А как представления могут помочь? Может я не понял что-то, потому-что проекции по сути тоже самое

Кирилл Дикалин
Если считать только эти колонки, где то 8 гб, 1,1 ...

очень слабенький сервер, телефон быстрее будет работать) Вам надо сокращать объём данных, или мат вью или проекции нужны

Кирилл Дикалин
А как представления могут помочь? Может я не понял...

Раньше если вам надо было ускорить какой-нибудь запрос, который содержит агрегации или для него требуется другой порядок сортировки, то использовали мат вьюхи, а потом переписывали код, чтобы для аыбранных запросов ипользовались эти мат вьюхи. Сейчас достаточно написать проекцию и она будет автоматически подхватываться, так что код переписыва не надо.

Кирилл-Дикалин Автор вопроса
Konstantin Ilchenko
очень слабенький сервер, телефон быстрее будет раб...

Сколько можете посоветовать ядер и памяти для таких объёмов (планируется в разы больше)? 8 ядер и 32 гига уже в 3 раза дороже будут стоить ) Хотелось бы убедиться, что проблема в этом

Кирилл Дикалин
Сколько можете посоветовать ядер и памяти для таки...

Ну если вместо 2 ядра будет 8, то скорость запросов врядли вырастет больше чем в 4 раза.

Кирилл-Дикалин Автор вопроса

Это запрос

Кирилл-Дикалин Автор вопроса
Кирилл Дикалин
Это запрос

У вас нет в дате фильтра по времени, а партицировпние по месяцам. Вы достаёте данные за всё время, а потом агрегируете? Не пробовали предагоегировать заранее?

Кирилл-Дикалин Автор вопроса
Vladimir Goncharov
Это только order by

CREATE TABLE table1 ( con0 Int64, con1 Int32, column1 String, column2 String, date DateTime ) ENGINE = MergeTree PARTITION BY toYYYYMM(date) ORDER BY (column1, column2, date) SETTINGS index_granularity = 65536, index_granularity_bytes = 83886080;

Кирилл-Дикалин Автор вопроса
Vladimir Goncharov
У вас нет в дате фильтра по времени, а партицировп...

Не подскажите как возможно заранее предагрегировать?

Кирилл Дикалин
Не подскажите как возможно заранее предагрегироват...

у вас нет фильтра по дате. это странно, но допустим так надо - вы делаете аналитику по всему интервалу доступных дней. Если это всегда так будет, то нет смысла складывать все значения по всем датам в момент запроса - можно сделать заранее. В результате в таблице будет меньше строк - col1,col2,val и меньше Mb.

Кирилл Дикалин
Не подскажите как возможно заранее предагрегироват...

Если фильтр по дате все-таки будет, то это уже уменьшит размер выборки при запросе - и это хорошо. Но можно ограничить возможность задания интервалов скажем 1 часом - и снова сложить заранее с точностью до 1 часа - меньше строк, мегабайт - быстрее.

Кирилл-Дикалин Автор вопроса
Boris
у вас нет фильтра по дате. это странно, но допуст...

Вообще аналитика по всему интервалу, а под фильтром по дате подразумевается ещё одно условие в WHERE по колонке date?

Кирилл Дикалин
Не подскажите как возможно заранее предагрегироват...

Сделайте отдельную таблицу/проекцию с группировкой по нужной колонке и максимумом нужного значения.

Кирилл Дикалин
Вообще аналитика по всему интервалу, а под фильтро...

Обычно аналитика по сырым данным смотрится только за последний период (день/неделя/месяц), а за весь период уже юзают агрегации, а не читают с диска терабайты данных.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта