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 ответов

10 просмотров

таблица на два поля и оба 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 попробуйте потренироваться...

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

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

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

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