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

Добрый день. Помогите понять как работают индексы пропуска в СН.

Документацию уже несколько раз перечитал, но понимание происходящего так и не пришло.
Для тестов использую простую таблицу из 3-х колонок - id (int32), value (int32), dt (datetime). Для чистоты эксперимента таблица создана без ключа сортировки. Естественно, любой запрос к такой таблице выполняет фул-скан. Дальше создаю индекс пропуска на колонку value, материализую его и пробую сделать какой-то запрос с условием на равенство по этой колонке. В результате СН в статистике запроса выводит информацию, что были просмотрены все строки, то есть выполнен фул-скан.
Если выполнить EXPLAIN indexes=1, то сообщается, что будут использованы все парты, но лишь 1/10 часть гранул.
Что не так с созданным мной индексом? Почему сообщается что просмотрены все строки? Почему наличие индекса никак не влияет на это и на скорость выполнения?

15 ответов

51 просмотр

Попробуйте сначала создать индекс, а потом залить данные .

Pavel-Pavlov Автор вопроса
Константин
Попробуйте сначала создать индекс, а потом залить ...

Это не всегда возможно. Да и для создания индекса по уже существующим данным должно быть достаточно выполнить MATERIALIZE INDEX, который как раз выполнит его построение. Но ради эксперимента попробую и так

Pavel Pavlov
Это не всегда возможно. Да и для создания индекса ...

Skip индексы точно будут применяться для новых патров/партиций, а вот для старых. Я не уверен

Pavel-Pavlov Автор вопроса
Константин
Skip индексы точно будут применяться для новых пат...

Я сейчас попробовал создать таблицу, навесить на нее индекс и после заполнить данными - результат тот же - выполнен фул-скан

Константин
Skip индексы точно будут применяться для новых пат...

насколько я понял, это зависит от разряженности данных в партах и собственно их кол-ва на диске?

Aleksandr Melnikov
насколько я понял, это зависит от разряженности да...

Ну там есть настройка Granularity, которая отвечает как часто ставить отметки в мета данных столбцов

Pavel-Pavlov Автор вопроса
Aleksandr Melnikov
насколько я понял, это зависит от разряженности да...

При создании таблицы используется дефолтная гранулярность и отсутствие какой-либо сортировки, то есть данные сохраняются в порядке их поступления гранулами по 8192 записи. Индекс создается с гранулярностью 10.

Pavel Pavlov
При создании таблицы используется дефолтная гранул...

Ваша задача уменьшить нагрузку на диск. Если у вас достаточно RAM и не петабайты данных - уменьшайте размер гранулы. Можно и 256 поставить. И коэффициент 2-3 для индекса. Пока не упретесь в размер памяти (индексы там) можно и не повышать.

Pavel-Pavlov Автор вопроса
Boris
Ваша задача уменьшить нагрузку на диск. Если у ва...

Да, правильно, стремимся снизить нагрузку на диск. Правильно ли понимаю, что если в первичном ключе не используются колонки, по которым строится индекс пропуска, то этот индекс не будет работать?

Pavel Pavlov
Да, правильно, стремимся снизить нагрузку на диск....

неправильно. первичный индекс сам по себе, а дополнительные индексы пропуска - на то они и дополнительные, работают отдельно. Но правильно настроить их под конкретные данные - непросто. У меня получалось некоторое ускорение - полнотекст по википедии работал за 5 сек. Лучше чем ничего, но.....

Pavel-Pavlov Автор вопроса
Boris
неправильно. первичный индекс сам по себе, а допо...

Если в транзакционных БД есть первичный ключ, который смотрит на конкретное смещение данных в файле и на него (на первичный индекс) уже указывают вторичные индексы, то как это работает с индексами пропуска в СН? Если мы не указываем при создании таблицы ключ сортировки и данные у нас храняться разрозненно, то при создании индекса пропуска как он будет связываться с данными? При наличии первичного ключа, в котором есть колонка, используемая в индексе пропуска, можно привязаться к этому индексу и по нему уже ориентироваться. Но как оно на самом деле?

Pavel Pavlov
Если в транзакционных БД есть первичный ключ, кото...

конечно тут совсем не те индексы, которые в транзакционных БД. Это четко сказано в документации. Тут скип индексы. Если брать блум, то это некоторое подобие хешей с большой долей коллизий. Т.е. если вы не попали в первичный индекс и получили фуллскан, то по сохраненным в памяти "типа хешам" можно принять решение что вот эту конкретную гранулу читать не надо - там ничего точно не найти. Но обратное неверно - может и прочитает, но все равно не найдет.

Pavel-Pavlov Автор вопроса
Boris
конечно тут совсем не те индексы, которые в транза...

Знаю, что по другому. Но может можете подсказать, как именно индексы пропуска ссылаются на данные на диске, особенно если говорить про тип minmax, как самые простые (как мне кажется)? Если правильно понял, то minmax полностю аналогичен по структуре первичным индексам. И есть ожидания, что будет работать аналогично.

Pavel Pavlov
Знаю, что по другому. Но может можете подсказать, ...

minmax индекс пропуска так работает - в ренже данных гранулярность индекса * гранулярность таблицы такой-то минимум и максимум

Pavel Pavlov
Знаю, что по другому. Но может можете подсказать, ...

первичный индекс основан на сортировке данных на диске. Имея в руках подходящее значение сразу понятно куда делать seek и какую гранулу читать. С вторичным иначе - перед чтением гранулы принимается решение - читать её или нет. В случае minmax в индексе прописаны верхние-нижние значения для конкретной группы гранул.

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

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

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