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

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

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

7 ответов

6 просмотров

вы не очень понятно описали задачу, можно понять неправильно. вобще-то строгое совпадения двух полей (даже текстовых) в разных таблицах решается через 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.) Два с половиной часа. Сервер какой-то более-менее приличный, поля не в индексе и взяты от балды. Зато работает без каких-то особых усилий. Если раз в неделю на ночь, то пойдет. А если ещё немного подумать над оптимизацией, то и подавно. Так что можно джойнить миллиарды.

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

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

@Aiwan что такое база образца?
Alexey
27
Не многие знают, а кто знает, тот уже успел забыть, что в далёком 2004 году эта игра произвела настоящий фурор, настолько революционной была технология, применяемая для её соз...
ICCID
4
коллеги, добрый вечер! А никто не знает как модальная форма может себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult...
Михаил
83
Короче я тут узнал полный пиздец Что кучу постов которые я создавал через posted Спустя время не могу редактировать и менять Мол телега возвращае ошибку Это реально так ...
inc.
13
Хотя у меня сейчас есть более сложная задача, вот её думаю: как объяснить челу переходного возраста противоположного полу, обучающегося в польском колледже (а-ля наш техникум)...
Вячеслав Кузьменко
15
а сколько всего в IT умерло? Где флеш-игры, их было туча, где они все? Сегодня технология есть, а завтра вжух и мёртвая. Этот wasm сильно напоминает джавовские апплеты, silver...
Constantin F.
5
Добрый день Хочу начать обучение языку, не являюсь представителем it, буду благодарна за помощь, совсем пока не понимаю ничего) Подскажите, пожалуйста, где можно начать первы...
Sara Lala
30
а вы в курсе, что Initialize() не работает? var arr123: array[0..123] of Byte; ... Initialize(arr123, SizeOf(arr123));
Iluha Companets
8
что читать по делфи?вообще 0 в нем
fd dsds
9
верно что я могу удалить эти addq и subq т.к. со стеком никакого взаимодействия нет (исключая call)?
Michael
16
Карта сайта