Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обработка данных в реальном времени / 14 сообщений из 14, страница 1 из 1
21.12.2018, 12:05
    #39751230
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Доброе время суток!

Есть около 15 промежуточных таблиц, в которые другая система часто (раз в несколько секунд) инсертит данные.
Общее количество вставляемых строк за день по некоторым таблицам может достигать 100-200 миллионов.

Мне же нужно эти строки как можно быстрее учесть в своих целевых таблицах (произвести инсерты или апдейты).
Новая строка в некоторых промежуточных таблицах приводит к тому, что приходится добавлять или изменять строки в НЕСКОЛЬКИХ моих целевых таблицах. Чтобы понять, как учесть строки в промежуточных таблицах и определить ключи справочных элементов моей системы я выполняю select'ы в которых эти таблицы соединяется (join) с другими таблицами моей системы.

Вот мой подход к решению данной задачи и проблемы с которыми я столкнулся.

1. Создана процедура перекладки данных из промежуточных таблиц в мои целевые таблицы.

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

3. Select'ы в процедуре перекладки, про которые я писал выше, часто выполняются неоптимальными путями.
Это происходит из-за того, что статистика по таблицам не актуальна.
Можно конечно перед (и во время) каждого запуска моей процедуры выполнять:
Код: plsql
1.
dbms_stats.gather_table_stats (ownname => user, tabname => 'Table')


по всем требуемым таблицам и по нужным партициям моих целевых таблиц, но данное действие выполняется продолжительное время, да еще и коммитит транзакцию, что также мне мешает.
Т.е., например, в статистике таблицы м.б. указано, что там 100 строк, а в реальности 10 миллионов, поэтому select из-за неоптимального плана выполнения запрос может выполняться длительное время.
Данную проблему я частично решил прописыванием хинтов в запросах, а также сбором статистики по условиям, т.е. например, если добавилось менее 50 тысяч записей в таблицу, то я не выполняю расчет статистики по ней, а если более то выполняю.
В некоторых случаях я устанавливаю статистику методом
Код: plsql
1.
DBMS_STATS.set_table_stats

для экономии времени.

4. После того как я обработал строки в промежуточных таблицах мне нужно как-то их пометить или удалить, чтобы не учитывать при следующих запусках процедуры загрузки.
Было решено удалять.
Для этого создано несколько временных таблиц с одним столбцом для хранения ROWID обработанных строк промежуточных таблиц.
В начале загрузки я произвожу инсерт ROWID всех строк промежуточных таблиц во временные таблицы, а после их обработки, удаляю по ROWID.
Минус этого в том, что DELETE очень тормозная операция и выполняется очень продолжительное время.
Можно конечно не удалять записи, а добавить новое поле и делать в нем отметку для обработанных записей, но апдейт тоже не быстрая операция и под конец дня мне придется просматривать таблицы с сотней миллионов строк, что тоже скажется на общем времени выполнения загрузки.
Можно конечно применить альтернативное удаление, например, с созданием промежуточной таблицы:
Код: plsql
1.
ALTER TABLE t_child EXCHANGE PARTITION P_2 WITH TABLE t_child_exch


Но меня немного смущает, что данная операция будет выполняться очень часто. Да и будет блокироваться промежуточная таблица, и если блокировка будет продолжительной, то это может негативно сказаться на работе системы, которая инсертит данные в мои промежуточные таблицы.
Также может возникнуть ситуация, когда для обработки строки в промежуточной таблице отсутствует какая-нибудь информация, например нет справочного элемента, тогда эту строку удалять не нужно.

Буду очень благодарен, если прокомментируете мое решение или поделитесь своим опытом решения подобных задач.
...
Рейтинг: 0 / 0
21.12.2018, 12:53
    #39751268
EvgeniaMakarova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
это у вас оперативная система и вы переносите данные в хранилище данных/в агрегаты ?
...
Рейтинг: 0 / 0
21.12.2018, 13:00
    #39751276
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
EvgeniaMakarova,

Система, которая мне присылает данные, является системой реального времени.

Моя же система является хранилищем данных, но также к ней предъявлено требование оперативного отображения присылаемых данных (допустима задержка в несколько минут).
...
Рейтинг: 0 / 0
21.12.2018, 13:11
    #39751285
EvgeniaMakarova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Андрей_7777,

тогда можно решать задачу ETL-ями, а именно батчами. Разделите свою задачу на подзачади.
Пусть етл-система(это могут быть ваши скрипты/джобы) раз в минуту/чаще/реже высылает вам батчи , вы будете их загружать так же кусочками.
Нужно подробнее описать или идея понятна?
...
Рейтинг: 0 / 0
21.12.2018, 13:55
    #39751310
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
EvgeniaMakarova,

Спасибо за помощь.

Проблема в том, что некоторые данные во вспомогательных таблицах могут быть не согласованными.
Т.е., например, нельзя грузить запись из таблицы со сделками, если еще не пришла заявка, на основании которой она заключена. В этом случае надо оставить строку со сделкой "на потом", до тех пор пока не придет нужна заявка.
Т.е. полностью обработать присылаемый кусочек я не смогу (по словам разработчиков системы-источника присылать мне согласованные данные им будет очень сложно).

Да, расскажите, пожалуйста, как осуществляется работа с батчами и про ETL.
Сейчас система-источник присылает мне батчи (инсертит в таблицы по несколько тысяч строк).
Только во вспомогательных таблицах нет никакого идентификатора батча, но в принцпе его можно добавить.
А дальше как? Нужно производить select из таблиц по последнему номеру батча или как-то по другому их обрабатывать?
...
Рейтинг: 0 / 0
21.12.2018, 14:07
    #39751323
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Андрей_7777Т.е., например, нельзя грузить запись из таблицы со сделками, если еще не пришла заявка,
на основании которой она заключена. В этом случае надо оставить строку со сделкой "на
потом", до тех пор пока не придет нужна заявка.

А почему, собственно, "нельзя"? Загрузить сделку сейчас, а заявку привязать к ней потом
что-то мешает? Или загрузить сделку с флагом "неподтвержённая"? Или загрузить её в
отдельную таблицу сделок, ожидающих заявки?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.12.2018, 14:14
    #39751328
EvgeniaMakarova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Андрей_7777EvgeniaMakarova,

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

Логику выгрузки значит надо продумать , например исходная система не должна высылать несогласованные данные.

почитайте про etl/elt подходы, там например еще есть staging area -тоже используется для всяких согласований и получения ключа по словарю. Ваша система смотрится слишком сложной для того чтобы не иметь ETL/ELT
...
Рейтинг: 0 / 0
21.12.2018, 14:20
    #39751332
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Dimitry Sibiryakov,

Не хотелось бы грузить несогласованные данные в целевые таблицы, иначе приложение, работающее с моей схемой, будет некорректно работать.
А вот грузить в отдельную таблицу такие строки можно.
...
Рейтинг: 0 / 0
21.12.2018, 14:29
    #39751345
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Андрей_7777А вот грузить в отдельную таблицу такие строки можно.

Значит выкидываешь джоб, который не срабатывает, процедуру раскладки данных переносишь в
INSTEAD OF триггера, а на все жалобы, что "стало медленно грузить" отвечаешь "таковы новые
требования, обработка данных в реальном времени".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.12.2018, 14:32
    #39751349
EvgeniaMakarova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Андрей_7777EvgeniaMakarova,

Спасибо за помощь.

Проблема в том, что некоторые данные во вспомогательных таблицах могут быть не согласованными.
Т.е., например, нельзя грузить запись из таблицы со сделками, если еще не пришла заявка, на основании которой она заключена. В этом случае надо оставить строку со сделкой "на потом", до тех пор пока не придет нужна заявка.
Т.е. полностью обработать присылаемый кусочек я не смогу (по словам разработчиков системы-источника присылать мне согласованные данные им будет очень сложно).

Да, расскажите, пожалуйста, как осуществляется работа с батчами и про ETL.
Сейчас система-источник присылает мне батчи (инсертит в таблицы по несколько тысяч строк).
Только во вспомогательных таблицах нет никакого идентификатора батча, но в принцпе его можно добавить.
А дальше как? Нужно производить select из таблиц по последнему номеру батча или как-то по другому их обрабатывать?

как придумаете. например, можно добавить столбец last_modified и писать туда с точностью до милисекунд, потом джоба раз в минуту которая будет вынимать по условию where last_modified >$last_load_time .
Например, эти батчи могут быть файлами с данными, они у вас будут складываться в папку и оттуда читаться лоад-процессом.
...
Рейтинг: 0 / 0
21.12.2018, 14:43
    #39751364
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Dimitry Sibiryakovа на все жалобы, что "стало медленно грузить" отвечаешь "таковы новые
требования, обработка данных в реальном времени".
Распространенное заблуждение заключается в том, что тезис "в реальном времени" воспринимается как "очень быстро".
Более корректно говорить о системе "с гарантированным временем отклика".
Причем отклик - не обязательно "все готово", он может быть (и бывает) "...ну не шмогла", однако обязан поступить в течение определенного временного интервала.
В этом смысле ни oracle rdbms, ни большинство ОС, на которых он работает, системами реального времени не являются от слова "совсем". Они могут лишь более-менее успешно эмулировать realtime при условии серьезного оверхеда по оборудованию.

Что касается построения хранилища с заявленными ТС характеристиками - то тема не вполне подходит для этого форума, тут сфероконь не вывезет. Придется учесть все аспекты, вплоть до возможностей платформы, на которой это крутится
...
Рейтинг: 0 / 0
21.12.2018, 14:44
    #39751368
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
EvgeniaMakarovaстолбец last_modified и писать туда с точностью до милисекунд
Не взлетит.
...
Рейтинг: 0 / 0
21.12.2018, 15:05
    #39751396
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
Андрей_7777,

паралельно (несколькими потоками) входной обрабатывается?

.....
stax
...
Рейтинг: 0 / 0
24.12.2018, 15:23
    #39752337
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка данных в реальном времени
>>Не взлетит.

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

для хранилищ реального времени используется обычно другой технологический стек - погугли лямбда/каппа архитектуру.

p.s. Женя, привет тебе :)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обработка данных в реальном времени / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]