Доброго времени суток. Подскажите пожалуйста как решить задачу одновременного выполнения sql запроса на нескольких однотипных БД. Проблема заключается в том, что если некий тяжелый запрос(минуты 2) надо выполнить на нескольких однотипных БД(40 шт.) то получаем совершенно неприемлемое время выполнения 2*40=1ч. 20 мин., если запускать как я, из цикла. Задача стоит в том что бы запрос одновременно запустить на всех 40 БД и получить время выполнения 2 мин.
что значит "отдельные БД"? Это типа несколько разных баз внутри одного сервера? Или это прям разные-разные серверы? Если один - то можно создать юзера, который имеет доступ ко всем, и от него можно бахнуть запрос хоть юнионом. А то, что их сорок штук - это что-то с архитектурой. Нафига их столько? Надо было не под каждого клиента БД клепать, а делать как обычно - в одну бд.
Быть может попытка шардирования? Ну или просто горизонтально маштабироваться пробуют. Но только накой тогда сразу везде запрос делать?... Накой его в принципе сразу везде делать?
Моя версия: это была попытка партицирования, разделили таблицу по условию, т.к. в ней дохера записей. В любом случае, что партицирование, что шардирование средствами приложения - так себе идея.
Например сведение аналитической информации. Сам работал с подобными проектами, только баз было - 30 штук. Каждая из которых имела объем чуть больше 30 терабайт, при том проводилась многоэтапная предварительная агрегация данных на каждой из баз, местами данные проганялись, через OLAP EXASOL. И в конце концов все сводилось в кучу и выполнялась финальная агрегация данных.
30 тб в реляционной бд это странно пахнет, но у тебя хотя бы понятно, почему их было несколько, но тоже под вопросом. Я не думаю, что у ТС такая же ситуация.
Можно чуток раскрыть тему? Мне в голову приходил только вариант опуститься на уровень ОС по средствам exec(), но это как то не элегантно получается, надо будет отслеживать завершение каждого процесса, после это все как то агрегировать и выводить пользователю. "Отдельные БД" в моем случае означает что есть один IBM z12, в котором выделено 2 LPAR под z/os(позже z-linux) на каждом из них крутится СУБД oracle, каждая субд управляет 20 БД. С архитектурой все правильно, так и должно быть. ЗЫ Это не партицирование и не шардирование, хотя партиции в каждой БД присутствуют.
если они разнесены, их нельзя слепить в одно и "с архитектурой всё правильно", то ответ очевиден и какие могут быть другие варианты - мне вообще представить сложно. =) Фигач запросы, чо ж поделать.
Похоже такая задача решается по средствам многопоточности. Опыту в таком программировании у меня null. Расширил свой кругозор статьей https://habrahabr.ru/post/40245/ Там автор реализует многопоточность по средствам множественных запросов к приложению через механизм web-соккетов. Это уже лучше чем моя задумка с exec(), но в моем случае не понятен вопрос агрегации полученных данных и вывод их пользователю. Можно конечно использовать внешнее хранилище доступное всем потокам аля файл или БД, но это как то кучеряво получается.
попробуй так: Каждый поток должен сделать как можно больше работы без связи с другими, результаты куда-то скинуть. Потом один поток эти результаты отработает.
Я бы взял ноду, expressjs для простенького api, oracle/node-oracledb и async для того что бы не устроить себе callback hell. Правильные инструменты превращают головняк в идеальные шорты ))
Завезли конечно, но в async реализованы разные алгоритмы и связанные с этим плюшки. Можно выполнять всё одновременно, можно строго по очереди, можно, к примеру, по 5 штук, ну и прочими извращениями. Бывает что полезно и однозначно более наглядно, к примеру: Код (Text): async.concat(tasks, worker, (err, results) => { console.log(results); }); Переберет массив tasks, выполнит с каждым элементов функцию worker и соберет весь результат в results. Короче, как и всегда это всё можно реализовать и без async, но зачем? )