тип Date.
И есть два варианта условия в запросе:
1. where ts = today()
2. where toYYYYMMDD(ts) = toYYYYMMDD(today())
Скажите, пожалуйста, КХ в обоих случаях будет работать только с одной партицией или только во втором?
``` SELECT toTypeName(toYYYYMMDD(now()), toTypeName(today()) ``` первое поле UInt32 второе Date в пермом случае у вас будет фуллскан во втором случае нормально отберутся партиции toUInt32(today()) тоже нормально сработает
Спасибо. Прочитал здесь, что КХ умеет отбрасывать ненужные партиции и добавил везде проверки, но, как выяснилось, неправильные))
извините фигню написал toUInt32(today()) у вас как раз и происходит ну вообще то что toYYYYMMDD возвращает UInt32 и что это YYYYMMDD в виде числа это надо по доке понять =) вообще у clickhouse с преобразованием типа беда хорошо если исключение кидается но в вашем случае просто молча глотает и делает преобразование в UInt32 но число получается ДРУГОЕ и делает фуллскан потому что не может определить быстро партицию SELECT toUInt32(today()), toYYYYMMDD(today()); два разных числа получаются
но при этом результат выборки корректный в обоих случаях, это влияет только на использование/не использование партиций
Что типы разные - это я понял, а вот что по умолчанию делается toUInt32() вместо toYYYYMMDD() - этого и не учёл, верил в магию))
Именно. В моём случае это лишние несколько часов времени)
Дополню - судя по всему, если ключ партиционирования содержится в ключе сортировки, то хватает и обычного ts = todate(), но если ключ партиционирования там отсутствует, то надо делать toYYYYMMDD(ts) = toYYYYMMDD(today()). Отсюда следует, что даже если партиционирование идёт по toYYYYMMDD от поля типа Date (т.е. в одной партиции всегда один день), то всё равно есть смысл добавлять это поле в ключ сортировки.
Обсуждают сегодня