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

А подскажите плиз по партициям. Создаю такую таблицу ```create table test_duration (

user_id Int64,
attempt Int64,
duration Float64,
added_at DateTime64(3) default now64()
)
engine = MergeTree
order by (user_id, attempt)
partition by toYYYYMM(added_at);```

запросы буду делать примерно такие
```select quantile(duration) from test_duration where user_id = 10 and attempt between 0 and 50000;```

т.е. всегда буду указывать user_id и attempt. Нужно ли для более эффективного поиска указывать поле, по которому партиционирование идет, added_at?

Потестил локально
```
insert into test_duration (user_id, attempt, duration, added_at)
select toInt64(number / 10000), number % 10000, number, now64() - interval number second from numbers(1000000000);
```
и как будто никакой разницы нет с фильтром по added_at и без него - количество строк считанных с диска не меняется.
А как оно в теории работает?

9 ответов

8 просмотров

так вы проверьте с фильтром added_at и без него. Это позволит не читать лишние партиции, если конечно указано поле в фильтре. А так как у вас не указано, разницы и не будет - сканирует все партиции

партиции это логическая структура и min max index внутри каждого парта... если у вас added_at в запросе в WHERE не участвует, то у вас partition pruning (отбрасывание партов из сканирование на основании значений added_at) на ранних этапах обработки запроса просто не имеет смысла ... и сканирование всегда пойдет по тем партам которые поппадают под user_id + attempt

https://youtu.be/DP7l6Swkskw?t=3777

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

Mikhail-Mayorov Автор вопроса
Denny [Altinity]
должна быть разница и большая. У вас просто что-то...

хм, до этого разницы не наблюдал, но как носом ткнули, заметил. С примером все ок. c3a2c1d2eec9 🙂 select quantile(duration) from test_duration where user_id = 10 and attempt between 0 and 5000; ┌─quantile(duration)─┐ │ 102500 │ └────────────────────┘ 1 rows in set. Elapsed: 0.032 sec. Processed 8.19 thousand rows, 196.61 KB (253.91 thousand rows/s., 6.09 MB/s.) c3a2c1d2eec9 🙂 select quantile(duration) from test_duration where user_id = 10 and attempt between 0 and 5000 and added_at between '2023-05-30 00:00:00' and '2023-05-31 00:00:00'; ┌─quantile(duration)─┐ │ 102500 │ └────────────────────┘ 1 rows in set. Elapsed: 0.005 sec. Processed 8.19 thousand rows, 262.14 KB (1.55 million rows/s., 49.52 MB/s.) на тестовом примере с added_at стабильно в 6 раз быстрее результат получаю. Т.е. лучше все же указывать поле, по которому партиционирование идет. Это ок, могу без проблем его достать. Спасибо)

Mikhail Mayorov
хм, до этого разницы не наблюдал, но как носом ткн...

пффф бред пример. Processed 8.19 thousand rows в обоих случаях у вас просто второй запрос быстрее потому что он второй и едет по кешированным данным. select count() from test_duration where added_at between '2023-05-30 00:00:00' and '2023-05-31 00:00:00'; select count() from test_duration; у вас toInt64(number / 10000) user только в одной партиции

Mikhail-Mayorov Автор вопроса
Denny [Altinity]
пффф бред пример. Processed 8.19 thousand rows в ...

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

Mikhail Mayorov
разницу стабильно получаю, хоть в каком порядке вы...

>Каждый пользователь вряд ли будет дольше одного месяца жить - так и есть, он скорее всего всегда будет попадать в одну партицию, это ожидаемо. в общем тогда без where added_at у вас будет драка за кеш засечек. И запросы будут выполнятся по 15сек, засечки очень медленно грузятся, это трудно показать надо нагенерить много данных, чтобы размер засечек стал больше чем 5ГБ.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта