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

Тут возник вопрос по примеру который был выше с джойнами

(https://t.me/clickhouse_ru/343260) , увидел там такое
CREATE TABLE WebhookHubMessageStatuses
(
`Id` Int32,
`Timestamp` Int64,
`IdMessage` Nullable(String),
`Status` Nullable(Int32),
....
INDEX wa_webhook_msg_status_IdMessageStatus (IdMessage, Status)
TYPE set(0)
GRANULARITY 8192
)
ENGINE = ReplacingMergeTree(__data_transfer_commit_time)
ORDER BY Id
SETTINGS index_granularity = 8192;
где у индекса выставлена гранулярность 8192, судя по доке это значит в индексе будет собираться по 64кк (8192*8192) строк. Т.е. фактически блоки скорее всего будут без разбивки идти?
И вопрос как это повлияет на производительность вставки и выборки?

10 ответов

8 просмотров

о блин пропустил это, да, индекс бесполезный и ничего не индексирует и скорее всего не используется гранулярность secondary indexes измеряется в гранулах первичного ключа... то есть там должно быть от 1 до 8 в целом. ну иногда 16 и 32 я видел... для очень редких кейсов тем боле что там еще и тип кривой set(0) я бы сделал ALTER TABLE ... DROP INDEX от греха подальше

Tetra- Автор вопроса
Slach [altinity]
о блин пропустил это, да, индекс бесполезный и нич...

а в целом не конкретно тут а в общей практике к чему приведет вот такая ошибка в плане производительности7

Tetra
а в целом не конкретно тут а в общей практике к че...

ну, индекс может пытаться использоваться и использоваться не эффективно потому что в клике индексы это data skip то есть при открытии парта и использовании индекса проверяется что искомого значения НЕТ в парте и поэтому его можно не сканировать... вообще data skip индексы плохо работают если искомые значения колонок размазаны ровным слоем по всем партам тогда получается оверхед на проверки индексов замедляет запрос потому что парты все равно сканируются... ну и когда куча мелких партов тоже будет замедление. но куча мелких партов это в любом случае жопа которую надо чинить со стороны INSERT

Tetra- Автор вопроса
Slach [altinity]
ну, индекс может пытаться использоваться и использ...

т.е. в случае set(0) но такой большой гранулярностью 8192 смысла в нем абсолютно нет, т.к. он будет говорить что среди 8192 гранул есть/нет искомого значения и если есть то он полезет читать эти данные. Т.е. по факту любой срабатывание данного индекса просто приводит к потенциальному чтению до 64кк строк и он реально бесполезен

Tetra
т.е. в случае set(0) но такой большой гранулярност...

конкретно set(0) + GRANULARITY 8192 тупо говорит "это значение есть в этих 8192 гранулах или нет" поскольку гранулы тоже не маленькие ... то он тупо проверяет есть или нет значение причем он еще и весить должен дофига, потому что фактически дублирует колонки IdMessage + Status в каждом парте, и я не помню, сжимаются ли data skip индексы или нет...

Tetra- Автор вопроса
Slach [altinity]
конкретно set(0) + GRANULARITY 8192 тупо говорит ...

спасибо, значит все правильно понимаю

если было например set(100) то если у нас больше 100 значений в блоке, то индекс пустой и тупо опять же не используется https://clickhouse.com/docs/en/optimize/skipping-indexes#set

Tetra- Автор вопроса
Slach [altinity]
если было например set(100) то если у нас больше 1...

это было проще понять, чем как влияет гранулярность

Slach [altinity]
конкретно set(0) + GRANULARITY 8192 тупо говорит ...

добрый день, этот индекс я создавал в тщетных попытках оптимизировать запрос и забыл удалить после того, как по EXPLAIN понял, что она бесполезная :) А можно ли в этом кейсе настроить и подобрать правильный skipping index или это в любом случае будет бесполезным?

galamsharx
добрый день, этот индекс я создавал в тщетных попы...

в каком этом кейсе??? там запрос где с WITH? повторюсь еще раз. эффективность skipping индексов зависит от того, как искомые значения распределяются по партам... если равномерно, то эффективность низкая, если нет. то норм

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

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

$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
здравствуйте. пытаюсь проверить, содержится ли в десятичном представлении инта некоторая цифра. совершаю: strstr(x, "5") != NULL) получаю ошибку с фото (заведомо неработающий ...
Катя Шевчук🪇
18
Что там вообще с кроссплатформенностью?
🄼🄰🄺🅉🄰🄸
23
Доброй ночи. Вопрос знатокам. Имеется некая таблица, результат которой выведен в DBGrid на форме. И есть форма, с помощью которой можно как добавить запись, так и отредактиров...
Евгений
28
Ребята. Этот вопрос мучает меня уже 13 - 15 лет. Почему при валидации в ФормЛистере у поля phone поведение странноватое и отличается от других? А именно, вот набор правил д...
Андрей [aharito] Харитонов
1
{ char buff = *start; *start = *end; *end = buff; } Из-за этой строчки? Что каждый символ через перем бафф? Как вариант использовать другие со...
Wenks
12
а всё почему? потому что ассемблер в отличии от яву порождает множество пагубных привычек, среди которых например можно отметить использование глобальных переменных для всего ...
Mixail Frolov
35
Кстати, а я вот тут подумал. Допустим, у нас имеется цикл который выполняет огромное количество итераций, но мы хотим, чтобы какие-то действия исполнилось только один раз. В Я...
The Bird of Hermes
23
Карта сайта