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

Доброе утро 1. У меня есть таблица где очень много записей

(статистика товара за каждый день)
2. Клиент выбирает произвольный период дат (от и до) и за весь период некоторые поля суммируются некоторые берутся среднее

Проблема:
Сейчас из за количества записей запрос выполняется слишком долго

Вопрос:
Как ускорить?

15 ответов

17 просмотров
Doniyor-Valizhanov Автор вопроса

пример запроса

Doniyor Valizhanov
screenshot пример запроса

А ключ сортировки дату содержит?

очень экстремально делать партиционирование по дням. Если вы храните 50 дней - это нормально, если год - нет. Что показывает select count() from system.parts where table = '...' and active? Возможно торможение именно тут. Если отсечка данных в ваших запросах преимущественно по дате, то её и ставьте на первое место, иначе индекс не работает - идет полное сканирование. Если вам помимо указанных аналитических запросов иногда надо делать выборки по product_id - добавляйте projection с order_by product_id. Или наоборот - оставьте основую как есть, но добавьте projection order by date. Но для начала решите вопрос с партиционированием. Партов не должно быть больше 1000

Doniyor-Valizhanov Автор вопроса
Konstantin Ilchenko
Почему 1000 партов а не 5000 например?

примерно. по мне и 1000 - уже много. Это же подкаталоги на одном уровне - файловая система уже притормаживать будет.

Boris
примерно. по мне и 1000 - уже много. Это же подка...

Ну, ext4 нормально жует такие кол-ва. В целом тысячи +-ок.

Konstantin Ilchenko
Почему 1000 партов а не 5000 например?

потому что в доке так рекомендуется =) A merge only works for data parts that have the same value for the partitioning expression. This means you shouldn’t make overly granular partitions (more than about a thousand partitions). Otherwise, the SELECT query performs poorly because of an unreasonably large number of files in the file system and open file descriptors.

Boris
примерно. по мне и 1000 - уже много. Это же подка...

сейчас 4000 дневных партов, тестим сейчас по сравнению с месячными, скорость плюс минус одниковая, только сжатие лучше на месячных

Doniyor Valizhanov
screenshot да

сколько записей в каждом дне? если меньше десяти миллионов, то лучше сделать toYYYYMM(date)

Doniyor Valizhanov
Около 20-30 миллионов

ну не мало в целом, но и не так чтобы много, можно по неделям партицировать сколько ядер на машине?

Doniyor Valizhanov
Около 20-30 миллионов

SELECT uniq(product_id)/count() FROM table WHERE ... ? сколько уникальных продуктов ? возможно тормоза потому что уж очень большая группировка получается

Boris
примерно. по мне и 1000 - уже много. Это же подка...

@unamedrus причина не файловой системе. Файловая система не создает оверхеда вообще. чтение 10000 файлов это 10000 seek. Представим себе что у нас нет фс. Но мы знаем откуда на диске надо читать, а надо читать из 10000 мест, это 10000 seek. А затем нам надо слить результаты из 10к стримов в 1.

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

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

$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
здравствуйте. пытаюсь проверить, содержится ли в десятичном представлении инта некоторая цифра. совершаю: strstr(x, "5") != NULL) получаю ошибку с фото (заведомо неработающий ...
Катя Шевчук🪇
18
Что там вообще с кроссплатформенностью?
🄼🄰🄺🅉🄰🄸
23
Доброй ночи. Вопрос знатокам. Имеется некая таблица, результат которой выведен в DBGrid на форме. И есть форма, с помощью которой можно как добавить запись, так и отредактиров...
Евгений
28
Ребята. Этот вопрос мучает меня уже 13 - 15 лет. Почему при валидации в ФормЛистере у поля phone поведение странноватое и отличается от других? А именно, вот набор правил д...
Андрей [aharito] Харитонов
1
{ char buff = *start; *start = *end; *end = buff; } Из-за этой строчки? Что каждый символ через перем бафф? Как вариант использовать другие со...
Wenks
12
а всё почему? потому что ассемблер в отличии от яву порождает множество пагубных привычек, среди которых например можно отметить использование глобальных переменных для всего ...
Mixail Frolov
35
Кстати, а я вот тут подумал. Допустим, у нас имеется цикл который выполняет огромное количество итераций, но мы хотим, чтобы какие-то действия исполнилось только один раз. В Я...
The Bird of Hermes
23
Карта сайта