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

Исходя из ваших комментариев, получается, что чтобы получить марты в

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

42 ответов

225 просмотров

Опасная тропинка. Получите 150 гиг словарей в оперативке и уже не такая это будет и радость)

Ну я например всю логику закинул в Спарк. А CH только отдаёт. Хотя это спорный момент.. в любом случае все справочники, кроме самого здорового убрать в словари надо. Здоровый... Ну там надо смотреть..

Владислав Lazycat
Ну я например всю логику закинул в Спарк. А CH тол...

Ну это зависит от данных основной таблицы и как словари сделать.

в данном случае не проблема, справочники не особо большие, просто памяти мало в наличии, я бы посмотрел в system.part_log табличку и проверил сколько партов вставляется и какое число строк в среднем получается, из-за того что много колонок и джойны нужна память

unhingedlunatic- Автор вопроса
Владислав Lazycat
Ну я например всю логику закинул в Спарк. А CH тол...

Ааа, расстраиваете) я только более-менее начал осваивать dbt, но если джойны таким образом делать нельзя, то он dbt отпадает(

unhingedlunatic- Автор вопроса
Konstantin Ilchenko
в данном случае не проблема, справочники не особо ...

16 гиг это пока дали поковыряться, потом будет побольше...64 гига хватит? Больше не дадут)

unhingedlunatic
Ааа, расстраиваете) я только более-менее начал осв...

Можно. Куча людей использует dbt. Правда. У них железо мощное. Ну из тех что я знаю

unhingedlunatic- Автор вопроса
Владислав Lazycat
Можно. Куча людей использует dbt. Правда. У них же...

Тогда я запутался. В dbt как-раз удобно делать снежинку, иметь справочники и факты. Но если, условно, как вы сказали, делать все это на Спарк, а в клик лить только для того ,чтобы он быстро отдавал, то где тут роль dbt? А иначе я никак не избегаю джойнов. Потому что я начинаю плясать от нормализованных данных.

unhingedlunatic
16 гиг это пока дали поковыряться, потом будет поб...

в целом в документации рекомендуется от 32 но я бы включил логи в trace и посмотрел куда время уходит

unhingedlunatic- Автор вопроса
Konstantin Ilchenko
в целом в документации рекомендуется от 32 но я бы...

Спасибо, почитаю, что это за логи и будем смотреть ☺️

Если данные из PG, то почему в нем же денормализацию и не сделать?

unhingedlunatic- Автор вопроса
Sergey Platonov
Если данные из PG, то почему в нем же денормализац...

Пока что по двум причинам: 1) в PG у меня доступ только к реплике без возможности создания/изменения там чего-либо 2) в PG все эти джойны и группировки долго выполняются. Я тоже до этого читал, что CH не любит джойны и т.д., но на менее мощном железе CH все эти джойны делает быстрее, чем PG Я все еще ищу какой-то более оптимальный способ для организации всего этого, опыта особо нет в проектировании где и на каком этапе лучше делать обработку, поэтому буду благодарен за любые советы 😊 Думаю это частая задача, когда из нормализованной OLTP в CH нужно перенести вьюшки.

unhingedlunatic
Пока что по двум причинам: 1) в PG у меня доступ т...

ну так сделайте к этой ПГ еще одну реплику ПГ :)) и делайте в ней что хотите )) в КХ можно совмещать миллионы записей и джойны, но для этого надо кропотливо работать Где-то словари, где-то сортировки и первичные ключи, где-то предагрегации бездумно поджойнить - это ПГ

unhingedlunatic- Автор вопроса
Sergey Platonov
ну так сделайте к этой ПГ еще одну реплику ПГ :)) ...

еще одна причина) в CH таблицы весят гораздо меньше, в PG у меня нет столько памяти все это хранить >бездумно поджойнить - это ПГ у меня как раз бездумные джойн получаются быстрее более-менее осмысленных в PG)

unhingedlunatic- Автор вопроса
Sergey Platonov
ну так сделайте к этой ПГ еще одну реплику ПГ :)) ...

а если я в CH на таблицы наложу ORDER BY на колонки, по которым идет джойн - станет быстрее?

unhingedlunatic
а если я в CH на таблицы наложу ORDER BY на колонк...

нет, КХ не использует индексы и orderby для join

unhingedlunatic
а если я в CH на таблицы наложу ORDER BY на колонк...

ненене - тут нету ответов из 2-3 пунктов )

unhingedlunatic
а PRIMARY KEY?)

под индексом я подразумевал primary key

Ανδρυχα ι κυκυχα
то есть они чисто для селектов?!

типа да. Но вообще в первую очередь они нужны чтобы данные сохранить, пожать и помержить

unhingedlunatic- Автор вопроса
Denny [Altinity]
под индексом я подразумевал primary key

SELECT -- для простоты напишу просто все поля из всех таблиц -- но по факту прописываю отдельно все 60 полей в селекте isr.* , cal.* , d.* , dr.* , dd.* -- таблица фактов 170 млн.строк FROM int_so_regions AS isr -- справочник-календарь на 2132 строк LEFT JOIN dim_calendar AS cal ON isr."date_report" = cal."date" -- справочник препаратов на 440596 строк LEFT JOIN dim_drug_so AS d ON isr."drug_id" = d."id" -- справочник регионов на 87 строк LEFT JOIN dictionary_region AS dr ON isr.region_id = dr.id -- справочник округов на 12 строк LEFT JOIN dictionary_district AS dd ON dr.district_id = dd.id т.е. если я сделаю все поля для джойнов как PRIMARY KEY скорость должна увеличиться? или это фиговая практика, накладывать PRIMARY KEY только для ускорения джойнов?

unhingedlunatic- Автор вопроса

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

unhingedlunatic- Автор вопроса
Dmitry [Altinity] Titov
Ну сожрет мегабайт 500

500 звучит немного) а в моем понимании словарь - это ключ-значение...а если мне из словаря надо для одного ключа получить 30 значений (разных колонок)?

unhingedlunatic
500 звучит немного) а в моем понимании словарь - э...

Да нормально, ток используйте HASHED_ARRAYS лайоут, он как раз для такого подойдет

unhingedlunatic- Автор вопроса
Sergey Platonov
30 раз напишите getDict

Не обязательно, словари имеют спец оптимизацию для join, И кстати dictGet может возвращать несколько аттрибутов как тапл

Sergey Platonov
ну вот ваш коллега рекомендовал все же getDict

Поэтому стоит попробовать и то и то Для тапла синтакс как то так выглядит dictGet(name, 'col_1, col_2', ..)

Sergey Platonov
ну вот ваш коллега рекомендовал все же getDict

потому что join со словорем автоматически транслируется в dictGet только если ключ словаря UInt64 и надо еше join_algorithm поставить=direct

Dmitry [Altinity] Titov
Поэтому стоит попробовать и то и то Для тапла синт...

я получил то на то а так как набор гетов уже написал, то так и оставил :))

Denny [Altinity]
потому что join со словорем автоматически транслир...

А это в какой версии появилось? Или изначально так было? Вроде бы раньше писали, что обращение к словарю без словарных функций типа dictGet/dictHas - это только для отладки.

Sergey Platonov
я получил то на то а так как набор гетов уже напис...

Там была проблема в том, что один дикт гет достает за один раз а 30 дикт гет выполняется 30 раз, но вроде это хотели оптимизировать, но не помню статус этой хотелки

Dmitry [Altinity] Titov
Там была проблема в том, что один дикт гет достает...

на данный момент 30 точно работает дольше, чем 1 🙂

Alexey Sokolov
А это в какой версии появилось? Или изначально так...

в 20... что-то там я потому и рекомендую dictGet потому что вы никогда не узнаете что оно перестало работать, ну будете запросы переписывать после апгрейда. т.е. оно работало, потом перестало, потом стало работать если =direct

Dmitry [Altinity] Titov
Там была проблема в том, что один дикт гет достает...

ну hashedArray оптимизирован под tuple, в хештаблицу один раз сходит

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта