
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
21.12.2018, 12:05
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Доброе время суток! Есть около 15 промежуточных таблиц, в которые другая система часто (раз в несколько секунд) инсертит данные. Общее количество вставляемых строк за день по некоторым таблицам может достигать 100-200 миллионов. Мне же нужно эти строки как можно быстрее учесть в своих целевых таблицах (произвести инсерты или апдейты). Новая строка в некоторых промежуточных таблицах приводит к тому, что приходится добавлять или изменять строки в НЕСКОЛЬКИХ моих целевых таблицах. Чтобы понять, как учесть строки в промежуточных таблицах и определить ключи справочных элементов моей системы я выполняю select'ы в которых эти таблицы соединяется (join) с другими таблицами моей системы. Вот мой подход к решению данной задачи и проблемы с которыми я столкнулся. 1. Создана процедура перекладки данных из промежуточных таблиц в мои целевые таблицы. 2. Создан джоб, который раз в минуту запускает процедуру перекладки данных. Иногда джоб отключается, поэтому количество записей в промежуточных таблицах может варьироваться от нескольких сотен до нескольких миллионов. 3. Select'ы в процедуре перекладки, про которые я писал выше, часто выполняются неоптимальными путями. Это происходит из-за того, что статистика по таблицам не актуальна. Можно конечно перед (и во время) каждого запуска моей процедуры выполнять: Код: plsql 1. по всем требуемым таблицам и по нужным партициям моих целевых таблиц, но данное действие выполняется продолжительное время, да еще и коммитит транзакцию, что также мне мешает. Т.е., например, в статистике таблицы м.б. указано, что там 100 строк, а в реальности 10 миллионов, поэтому select из-за неоптимального плана выполнения запрос может выполняться длительное время. Данную проблему я частично решил прописыванием хинтов в запросах, а также сбором статистики по условиям, т.е. например, если добавилось менее 50 тысяч записей в таблицу, то я не выполняю расчет статистики по ней, а если более то выполняю. В некоторых случаях я устанавливаю статистику методом Код: plsql 1. для экономии времени. 4. После того как я обработал строки в промежуточных таблицах мне нужно как-то их пометить или удалить, чтобы не учитывать при следующих запусках процедуры загрузки. Было решено удалять. Для этого создано несколько временных таблиц с одним столбцом для хранения ROWID обработанных строк промежуточных таблиц. В начале загрузки я произвожу инсерт ROWID всех строк промежуточных таблиц во временные таблицы, а после их обработки, удаляю по ROWID. Минус этого в том, что DELETE очень тормозная операция и выполняется очень продолжительное время. Можно конечно не удалять записи, а добавить новое поле и делать в нем отметку для обработанных записей, но апдейт тоже не быстрая операция и под конец дня мне придется просматривать таблицы с сотней миллионов строк, что тоже скажется на общем времени выполнения загрузки. Можно конечно применить альтернативное удаление, например, с созданием промежуточной таблицы: Код: plsql 1. Но меня немного смущает, что данная операция будет выполняться очень часто. Да и будет блокироваться промежуточная таблица, и если блокировка будет продолжительной, то это может негативно сказаться на работе системы, которая инсертит данные в мои промежуточные таблицы. Также может возникнуть ситуация, когда для обработки строки в промежуточной таблице отсутствует какая-нибудь информация, например нет справочного элемента, тогда эту строку удалять не нужно. Буду очень благодарен, если прокомментируете мое решение или поделитесь своим опытом решения подобных задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 12:53
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
это у вас оперативная система и вы переносите данные в хранилище данных/в агрегаты ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 13:00
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
EvgeniaMakarova, Система, которая мне присылает данные, является системой реального времени. Моя же система является хранилищем данных, но также к ней предъявлено требование оперативного отображения присылаемых данных (допустима задержка в несколько минут). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 13:11
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Андрей_7777, тогда можно решать задачу ETL-ями, а именно батчами. Разделите свою задачу на подзачади. Пусть етл-система(это могут быть ваши скрипты/джобы) раз в минуту/чаще/реже высылает вам батчи , вы будете их загружать так же кусочками. Нужно подробнее описать или идея понятна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 13:55
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
EvgeniaMakarova, Спасибо за помощь. Проблема в том, что некоторые данные во вспомогательных таблицах могут быть не согласованными. Т.е., например, нельзя грузить запись из таблицы со сделками, если еще не пришла заявка, на основании которой она заключена. В этом случае надо оставить строку со сделкой "на потом", до тех пор пока не придет нужна заявка. Т.е. полностью обработать присылаемый кусочек я не смогу (по словам разработчиков системы-источника присылать мне согласованные данные им будет очень сложно). Да, расскажите, пожалуйста, как осуществляется работа с батчами и про ETL. Сейчас система-источник присылает мне батчи (инсертит в таблицы по несколько тысяч строк). Только во вспомогательных таблицах нет никакого идентификатора батча, но в принцпе его можно добавить. А дальше как? Нужно производить select из таблиц по последнему номеру батча или как-то по другому их обрабатывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 14:07
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Андрей_7777Т.е., например, нельзя грузить запись из таблицы со сделками, если еще не пришла заявка, на основании которой она заключена. В этом случае надо оставить строку со сделкой "на потом", до тех пор пока не придет нужна заявка. А почему, собственно, "нельзя"? Загрузить сделку сейчас, а заявку привязать к ней потом что-то мешает? Или загрузить сделку с флагом "неподтвержённая"? Или загрузить её в отдельную таблицу сделок, ожидающих заявки? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 14:14
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Андрей_7777EvgeniaMakarova, нельзя грузить запись из таблицы со сделками, если еще не пришла заявка, на основании которой она заключена. Логику выгрузки значит надо продумать , например исходная система не должна высылать несогласованные данные. почитайте про etl/elt подходы, там например еще есть staging area -тоже используется для всяких согласований и получения ключа по словарю. Ваша система смотрится слишком сложной для того чтобы не иметь ETL/ELT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 14:20
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Dimitry Sibiryakov, Не хотелось бы грузить несогласованные данные в целевые таблицы, иначе приложение, работающее с моей схемой, будет некорректно работать. А вот грузить в отдельную таблицу такие строки можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 14:29
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Андрей_7777А вот грузить в отдельную таблицу такие строки можно. Значит выкидываешь джоб, который не срабатывает, процедуру раскладки данных переносишь в INSTEAD OF триггера, а на все жалобы, что "стало медленно грузить" отвечаешь "таковы новые требования, обработка данных в реальном времени". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 14:32
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Андрей_7777EvgeniaMakarova, Спасибо за помощь. Проблема в том, что некоторые данные во вспомогательных таблицах могут быть не согласованными. Т.е., например, нельзя грузить запись из таблицы со сделками, если еще не пришла заявка, на основании которой она заключена. В этом случае надо оставить строку со сделкой "на потом", до тех пор пока не придет нужна заявка. Т.е. полностью обработать присылаемый кусочек я не смогу (по словам разработчиков системы-источника присылать мне согласованные данные им будет очень сложно). Да, расскажите, пожалуйста, как осуществляется работа с батчами и про ETL. Сейчас система-источник присылает мне батчи (инсертит в таблицы по несколько тысяч строк). Только во вспомогательных таблицах нет никакого идентификатора батча, но в принцпе его можно добавить. А дальше как? Нужно производить select из таблиц по последнему номеру батча или как-то по другому их обрабатывать? как придумаете. например, можно добавить столбец last_modified и писать туда с точностью до милисекунд, потом джоба раз в минуту которая будет вынимать по условию where last_modified >$last_load_time . Например, эти батчи могут быть файлами с данными, они у вас будут складываться в папку и оттуда читаться лоад-процессом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 14:43
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
Dimitry Sibiryakovа на все жалобы, что "стало медленно грузить" отвечаешь "таковы новые требования, обработка данных в реальном времени". Распространенное заблуждение заключается в том, что тезис "в реальном времени" воспринимается как "очень быстро". Более корректно говорить о системе "с гарантированным временем отклика". Причем отклик - не обязательно "все готово", он может быть (и бывает) "...ну не шмогла", однако обязан поступить в течение определенного временного интервала. В этом смысле ни oracle rdbms, ни большинство ОС, на которых он работает, системами реального времени не являются от слова "совсем". Они могут лишь более-менее успешно эмулировать realtime при условии серьезного оверхеда по оборудованию. Что касается построения хранилища с заявленными ТС характеристиками - то тема не вполне подходит для этого форума, тут сфероконь не вывезет. Придется учесть все аспекты, вплоть до возможностей платформы, на которой это крутится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 14:44
|
|||
|---|---|---|---|
|
|||
Обработка данных в реальном времени |
|||
|
#18+
EvgeniaMakarovaстолбец last_modified и писать туда с точностью до милисекунд Не взлетит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.12.2018, 15:05
|
|||
|---|---|---|---|
Обработка данных в реальном времени |
|||
|
#18+
Андрей_7777, паралельно (несколькими потоками) входной обрабатывается? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.12.2018, 15:23
|
|||
|---|---|---|---|
Обработка данных в реальном времени |
|||
|
#18+
>>Не взлетит. плюсую яро. это мой один из любимых вопросов на собеседовании какие есть риски с таким подходом, причём именно в ситуации, описанной топикстартером. отвечает очень мало людей. для хранилищ реального времени используется обычно другой технологический стек - погугли лямбда/каппа архитектуру. p.s. Женя, привет тебе :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=52&tablet=1&tid=1883004]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 322ms |

| 0 / 0 |
