важно понять что все записи во всех партах во всех колонках отсортированы в этом порядке
поэто мерж ничего не сортирует
малокардинальные поля вначале индекса (toStartOfDay(datetime) = 30 значений в партиции) позволяют делать как бы fast-full-index-scan в терминах оракла и использовать задние поля без передних
toDate(datetime) -- экономит память, datetime 32 бита, date 16 бит
О, что индекс всегда в памяти не знал. Спасибо.
Я как раз на выходных пробовал подобрать оптимальный index_granularity для таблицы BigTable (id UUID, ts DateTime, ...) engine=MergeTree() order by (toDate(ts), id)
, которая используется в запросах вида select * from BigTable where id in (select id from SmallTableWithRandomIDs) and ts>=today()-7
.
И результат получился странный: с уменьшением index_granularity (пробовал варианты от 1024 до 8) у меня уменьшался объём используемой памяти, уменьшалось количество прочитанных строк, но увеличивалось время выполнения запроса.
С прочитанными строками и памятью понятно, этого и добивался. Можете объяснить почему увеличилось время запроса (ведь дорогих чтений с диска столько же, размер обрабатываемых в памяти блоков тоже меньше)?