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

Всем привет. подскажите по оптимизации поиска в кх: есть две таблицы mergetree

с текстовыми полями, надо искать совпадения этих полей между собой. таблицы постоянно увеличиваются, строк там потенциально миллиарды.
есть два вопроса:
1. поиск планирую делать через where, может есть что-то лучшее для поиска дубликатов?
2. есть ли смысл вводить доп поле, по которому делать prewhere? например последний индекс поля второй таблицы, либо же это излишне, т.к. два where все равно будут бегать по всем строкам?

7 ответов

23 просмотра

вы не очень понятно описали задачу, можно понять неправильно. вобще-то строгое совпадения двух полей (даже текстовых) в разных таблицах решается через join, для которого существуют разные оптимизации. Но если дубликаты - это это строки в одной таблице - это иная задача. И в любом случае - полный проход по миллиардным таблицам - это всегда плохо, надо как-то избегать такого - например делать обратные индексы (скажем на основе MV/projectons), или как тут недавно обсуждалось - битмапами.

Yury- Автор вопроса
Boris
вы не очень понятно описали задачу, можно понять н...

да, надо искать строгое совпадение двух полей в разных таблицах. join как раз подойдет. но как он себя поведет на миллиардных таблицах? проверка по сути нужна не очень часто, примерно раз в неделю и длительность выполнения не очень критична в разумных пределах...

при джойне правая таблица помещается в память. если памяти не хватит, тогда всё, приплыли

Dmnk ninja
Так вроде merge join завезли

круть. и как оно? работает сильно медленнее?

Vladimir Goncharov
круть. и как оно? работает сильно медленнее?

А я хз, я давно не пользуюсь кх, тока чатик читаю

Vladimir Goncharov
круть. и как оно? работает сильно медленнее?

ну так.... SELECT formatReadableQuantity(count()) FROM calls │ 1.53 billion │ SET join_algorithm = 'partial_merge' SELECT count() FROM calls AS c1 INNER JOIN calls AS c2 ON c1.client = c2.companyTelnum ↓ Progress: 2.28 billion rows, 18.27 GB (404.36 thousand rows/s., 3.23 MB/s.) │ 2590808638539 │ 1 rows in set. Elapsed: 10954.815 sec. Processed 3.06 billion rows, 24.50 GB (279.57 thousand rows/s., 2.24 MB/s.) Два с половиной часа. Сервер какой-то более-менее приличный, поля не в индексе и взяты от балды. Зато работает без каких-то особых усилий. Если раз в неделю на ночь, то пойдет. А если ещё немного подумать над оптимизацией, то и подавно. Так что можно джойнить миллиарды.

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

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

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