запросе используется только where b=5. Сможет ли Clickhouse использовать индекс в этом случае, т.е. не делать full scan?
Если каждый А имеет Б = 5, то пройдёт по всем А и найдёт все Б.
для всех a надо будет знать где искать b. Если у вас a - это высокочастотное значение типа UUID - то считайте что у вас фулскан будет
зависит от кардинальности колонки A
А какая в этом логика? Если у нас все равно по гранулам бьётся? Пусть кардинальность большая, но мы же можем в индекс посмотреть, а там для второй колонки есть минимумы гранул
не понял вы считаете, что если в индексе две колонки, то каждая отсортирована в своем порядке?
это два набора меток, а потом, чтобы из этого строку собрать, надо lookup этих меток делать? а на три колонки — три набора меток..
Нет, порядок один. Просто мы же можем по индексу пройти. Первую колонку мы не знаем, но вторую знаем. И по индексу понять, что некоторые гранулы нам считывать не нужно (там минимум меньше, чем нам нужно).
если в первой колонке значения уникальные, то "пройти по индексу" для второй колонки — это тот же скан
Но у нас же индекс разреженный. Мы будем смотреть только каждую 8000ую запись и то в памяти
и там каждое 8000 значение рандомное, потому что сначала отсортировано по уникальной первой колонке
Но это рандомное значение является минимумом в грануле. Если мы ищем по b, которое меньше этого значения, то мы можем гранулу не считывать
Бахните now64 в первую, а во вторую number%10 и увидете о чем говорит Иван
таблица col1, col2 значения (a, 100), ..., (c, 100), ... (b,50) делаем индекс (col1, col2) метки: (a, 100), ..., (b,50), ..., (c, 100) ваш "min max" для col2 "в точке b" благополучно невалиден
CREATE TABLE test_pk ENGINE MergeTree PRIMARY KEY (now_1,number_10) as SELECT now64() as now_1, number%10 as number_10 FROM numbers(10000) И потестите запросы
10000 записей это две гранулы, думаю индекс тут никак не повлияет
Ну можно же увеличить .....
Обсуждают сегодня