Size: a a a

ClickHouse не тормозит

2021 January 26

l

lnuynxa in ClickHouse не тормозит
Tatyana Agalakova
Приветик всем!мб кто-то знает как это реализовать:
Мне нужно из таблицы со значением месяцев (1,2,3...) вытаскивать значения через фильтр в redash в текстовом формате типо Январь=1
Словаря такого нет и не предвидится
Есть какой вариант это в запросе прописать?
сделать каст к enum либо transform
источник

AS

Alexey Sokolov in ClickHouse не тормозит
KiLEX 萊赫
в 1 варианте точно будет работать с одной партицией
Вот на тестовом примере из девяти строк у меня оба варианта работают одинаково, а на рабочем с миллиардами записей лишние отсекает почему-то только второй (судя по столбцу read_rows в таблице system.query_log, первый вариант читает в несколько раз больше строк).

Мб есть какие-то дополнительные факторы?

Поле, по которому идёт партиционирование, в ключе сортировки не используется, в условиях запроса больше не фигурирует. Движок - ReplicatedMergeTree, КХ 20.1.9.54
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Alexey Sokolov
Вот на тестовом примере из девяти строк у меня оба варианта работают одинаково, а на рабочем с миллиардами записей лишние отсекает почему-то только второй (судя по столбцу read_rows в таблице system.query_log, первый вариант читает в несколько раз больше строк).

Мб есть какие-то дополнительные факторы?

Поле, по которому идёт партиционирование, в ключе сортировки не используется, в условиях запроса больше не фигурирует. Движок - ReplicatedMergeTree, КХ 20.1.9.54
а весь запрос можно увидеть? может там есть OR ?

типа where ts = today() OR id=1111 даст фулскан
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Alexey Sokolov
Вот на тестовом примере из девяти строк у меня оба варианта работают одинаково, а на рабочем с миллиардами записей лишние отсекает почему-то только второй (судя по столбцу read_rows в таблице system.query_log, первый вариант читает в несколько раз больше строк).

Мб есть какие-то дополнительные факторы?

Поле, по которому идёт партиционирование, в ключе сортировки не используется, в условиях запроса больше не фигурирует. Движок - ReplicatedMergeTree, КХ 20.1.9.54
офигеть. проверил на своих данных, если использовать именно today() то партиции вообще не учитываются
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Alexey Sokolov
Вот на тестовом примере из девяти строк у меня оба варианта работают одинаково, а на рабочем с миллиардами записей лишние отсекает почему-то только второй (судя по столбцу read_rows в таблице system.query_log, первый вариант читает в несколько раз больше строк).

Мб есть какие-то дополнительные факторы?

Поле, по которому идёт партиционирование, в ключе сортировки не используется, в условиях запроса больше не фигурирует. Движок - ReplicatedMergeTree, КХ 20.1.9.54
where op_type=1 AND open_datetime > today() GROUP BY dt;
Processed 255.50 million rows

where op_type=1 AND toYYYYMMDD(open_datetime) > toYYYYMMDD(today()) GROUP BY dt;
Processed 4.30 thousand rows
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
если указывать дату явно - то все корректно отрабатывает, если использовать today() то фулскан. больше на багу похоже
источник

S

Slach in ClickHouse не тормозит
Tatyana Agalakova
Приветик всем!мб кто-то знает как это реализовать:
Мне нужно из таблицы со значением месяцев (1,2,3...) вытаскивать значения через фильтр в redash в текстовом формате типо Январь=1
Словаря такого нет и не предвидится
Есть какой вариант это в запросе прописать?
SELECT *
FROM
(
   SELECT *
   FROM
   (
       SELECT
           ['Январь', 'Февраль', 'Март', 'Апрель'] AS m_name,
           arrayEnumerate(m_name) AS m_num
   ) AS months
   ARRAY JOIN
       m_name,
       m_num
) AS dict_months


и можно это как то как subquery для JOIN использовать
к основной таблице

но лучше всего ТУПО СОЗДАТЬ СЛОВАРЬ, это проще
источник

S

Slach in ClickHouse не тормозит
KiLEX 萊赫
офигеть. проверил на своих данных, если использовать именно today() то партиции вообще не учитываются
а если toDate(now()) ?
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Slach
а если toDate(now()) ?
toDate(today()) криво
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
AND open_datetime > now() GROUP BY dt;
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
вот так правильно всё
источник

S

Slach in ClickHouse не тормозит
KiLEX 萊赫
AND open_datetime > now() GROUP BY dt;
у вас данные в будующем ?
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Slach
у вас данные в будующем ?
да) это нормально
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Alexey Sokolov
Вот на тестовом примере из девяти строк у меня оба варианта работают одинаково, а на рабочем с миллиардами записей лишние отсекает почему-то только второй (судя по столбцу read_rows в таблице system.query_log, первый вариант читает в несколько раз больше строк).

Мб есть какие-то дополнительные факторы?

Поле, по которому идёт партиционирование, в ключе сортировки не используется, в условиях запроса больше не фигурирует. Движок - ReplicatedMergeTree, КХ 20.1.9.54
AND open_datetime > now() GROUP BY dt;

вот так работает корректно
источник

S

Slach in ClickHouse не тормозит
Alexey Sokolov
Всем привет.

Есть таблица с партиционированием по toYYYYMMDD(ts), где ts имеет тип Date.

И есть два варианта условия в запросе:
1. where ts = today()
2. where toYYYYMMDD(ts) = toYYYYMMDD(today())

Скажите, пожалуйста, КХ в обоих случаях будет работать только с одной партицией или только во втором?
```
SELECT toTypeName(toYYYYMMDD(now()), toTypeName(today())
```
первое поле UInt32 второе Date

в пермом случае у вас будет фуллскан
во втором случае нормально отберутся партиции

toUInt32(today())
тоже нормально сработает
источник

D

Dj in ClickHouse не тормозит
Vadim Metikov
max_bytes_to_merge_at_max_space_in_pool - нет такой настройки,
number_of_free_entries_in_pool_to_lower_max_size_of_merge - это имя метрики?
select * from system.merge_tree_settings s where name like '%merge%';
источник

AS

Alexey Sokolov in ClickHouse не тормозит
Slach
```
SELECT toTypeName(toYYYYMMDD(now()), toTypeName(today())
```
первое поле UInt32 второе Date

в пермом случае у вас будет фуллскан
во втором случае нормально отберутся партиции

toUInt32(today())
тоже нормально сработает
Спасибо.

Прочитал здесь, что КХ умеет отбрасывать ненужные партиции и добавил везде проверки, но, как выяснилось, неправильные))
источник

S

Slach in ClickHouse не тормозит
Alexey Sokolov
Спасибо.

Прочитал здесь, что КХ умеет отбрасывать ненужные партиции и добавил везде проверки, но, как выяснилось, неправильные))
извините фигню написал toUInt32(today()) у вас как раз и происходит

ну вообще то что toYYYYMMDD возвращает UInt32 и что это YYYYMMDD в виде числа это надо по доке понять  =)

вообще у clickhouse с преобразованием типа беда
хорошо если исключение кидается
но в вашем случае просто молча глотает и делает преобразование в UInt32 но число получается ДРУГОЕ
и делает фуллскан потому что не может определить быстро партицию

SELECT toUInt32(today()), toYYYYMMDD(today());
два разных числа получаются
источник

c

critskiy in ClickHouse не тормозит
Здравствуйте всем, есть вопрос насчет шардинга и select выборки с syntax HAVING. На шардированной таблице на движке MergeTree может ли быть downgrade запроса c HAVING statement, или же в данном случае лучше рассмотреть шардирование на базе AggregatingMegreTree (есть у меня такое подозрение, но может я мудак)?
источник

S

Slach in ClickHouse не тормозит
critskiy
Здравствуйте всем, есть вопрос насчет шардинга и select выборки с syntax HAVING. На шардированной таблице на движке MergeTree может ли быть downgrade запроса c HAVING statement, или же в данном случае лучше рассмотреть шардирование на базе AggregatingMegreTree (есть у меня такое подозрение, но может я мудак)?
под словом downgrade вы имеет ввиду проброс push down условия HAVING на ноды кластера при исполнении чтения из Distributed таблицы?
источник