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

Еще один вопрос к общественности: есть таблица big_table с двумя столбцами

(id String, value String) order by id,
в таблице около 50 миллиардов строк, все ключи и значения уникальны,

есть запрос small_query, который выдаёт около 1 миллиона строк с уникальными value,

если написать запрос вида
insert into new_table select id, value from big_table where value in (select value from small_query)
то естественно имеем full scan всей большой таблицы, который занимает неприличное время

как лучше организовать таблицы (ключи, индексы, что-то еще) чтобы такие запросы выполнялись более эффективно?

20 ответов

6 просмотров

таблица на два поля и оба String у вас архитектор системы точно трезвый?

Дмитрий Жучков
поправка - id - FixedString(16) :)

Этим данным точно место в кликхаус?

Дмитрий-Жучков Автор вопроса
Aleksandr Danilov 🇺🇦
Этим данным точно место в кликхаус?

данные точно нужны, и используются именно в качестве преобразования вида value —> id

Дмитрий Жучков
данные точно нужны, и используются именно в качест...

вопрос не "нужны ли данные" вопрос - "точно ли для них подходит кликхаус" если нужно только преобразование, то даже Redis смотрится более подходящим

Дмитрий-Жучков Автор вопроса
Aleksandr Danilov 🇺🇦
вопрос не "нужны ли данные" вопрос - "точно ли дл...

вот тут уже сложнее, система для меня новая, еще не всё понятно, архитектуру менять задачи не было, пока пытаюсь реализовать выборку за приемлемое время есть входной поток данных - во входном потоке приходят значения value, а таблица на 60 миллиардов выполняет роль справочника, чтобы обогатить входной поток ключами, потом по этим ключам к входным данным будет прикрепляться другая полезная информация

ну как вариант проекция в которой другой ORDER BY value задан... или SkipIndex но насколько это будет эффективнее full scan непонятно сильно завистит от того по скольким партам ваш этот уникальный миллион размазан...

Дмитрий-Жучков Автор вопроса
Slach [altinity]
ну как вариант проекция в которой другой ORDER BY ...

точно никто не мерял, но условно считаем, что 1 миллион размазан по большой таблице равномерно, про партиции да, косяк, сразу не написал - они есть и их уже больше 3800 штук

Дмитрий Жучков
точно никто не мерял, но условно считаем, что 1 ми...

ну и вот смотрите у вас есть колонка... value она упакована... поскольку это FixedString(16) предположу, что у вас таблица создана во времена когда не было UUID и это UUID который скорее всего не UUIDv8 который может быть монотонно возврастающим... а обычный UUIDv4 skip indexes тут врятли помогут, потому что они скорее всего будет говорить что в данном парте данные скорее всего есть и парт все равно придется читать... проекция с другим order by может быть поможет но данных на диске станет в два раза больше... и ее еще MATERIALIZE сделать надо для старых данных...

Дмитрий-Жучков Автор вопроса
Slach [altinity]
ну и вот смотрите у вас есть колонка... value она ...

да, всё так - оба поля это практически UUID'ы, только немного оригинальные, поэтому хранятся в виде простых строк, ок, пойду читать про проекции, спасибо за наводку!

Дмитрий Жучков
да, всё так - оба поля это практически UUID'ы, тол...

ну протестируйте сначала на одном миллионе сабсет... дальше будет понятно работает это или нет...

Дмитрий-Жучков Автор вопроса
Slach [altinity]
ну протестируйте сначала на одном миллионе сабсет....

даже на 100 миллионах запрос выполняется за 0.6 секунды, проблемы начинаются именно на полной таблице :)

Дмитрий-Жучков Автор вопроса
Slach [altinity]
проблемы это в смысле "6 секунд"? или что?

проблемы - это за 20-30 минут прочитано 10% от планируемого числа строк и ничего никуда не вставлено,

Дмитрий Жучков
проблемы - это за 20-30 минут прочитано 10% от пла...

ну вы на select + limit попробуйте потренироваться.... без insert

Дмитрий-Жучков Автор вопроса
Slach [altinity]
или на 100 миллиона там 100 000 value уникальных?

100 миллионов это тестовый кусок от 60 миллиардов, остальные данные не менялись - то есть 1 миллион остался как есть

Дмитрий-Жучков Автор вопроса
Slach [altinity]
ну вы на select + limit попробуйте потренироваться...

select ... limit 200 выполняется за 10 секунд, но об общей картине ничего не говорит

Дмитрий-Жучков Автор вопроса
Slach [altinity]
ну вы на select + limit попробуйте потренироваться...

более того, относительно недавно выполнялся полный запрос, но видимо нагрузка на сервер возросла или объемы увеличились и всё поплыло

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

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

Типа вызывать GetParent и проверять на соответствие GetModuleHandle?
The Bird of Hermes
67
Do any of you guys have interesting projects one could join? I'm a Middle Full-Stack developer (JS/TS, React & Node)
Lev Shapiro
40
$res = json_decode($наша строка из респонса); $res1 = array_map(fn($o) => $o->name, $res->breadcrumbs[0]->entities); Как такое будет на Хаскеле?.. В начале весь джейсон, в ко...
Хаскель Моисеевич Гопник
27
В чем сила брат, в NASM или FASM?
Isaac Kleiner
18
Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
11
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
Хтось використовував Vapor на Windows?
Jaroshevskii
15
Какое виндузовое сообщение приходит TTabSheet, что риэлайняться контролы на нем, даже у которых парент другой? Ситуация: открываю форму - кнопок нет, перелистываю на другой т...
Катерина Свиридова
7
Тут кста кто-нибудь NeoVim использует?
Simple Sorcerer
13
Карта сайта