За последние 24 часа нас посетили 17896 программистов и 1286 роботов. Сейчас ищут 1446 программистов ...

Одновременное выполнение sql по нескольким БД

Тема в разделе "PHP и базы данных", создана пользователем torm84, 4 май 2017.

  1. torm84

    torm84 Активный пользователь

    С нами с:
    17 май 2010
    Сообщения:
    23
    Симпатии:
    0
    Доброго времени суток.

    Подскажите пожалуйста как решить задачу одновременного выполнения sql запроса на нескольких однотипных БД.
    Проблема заключается в том, что если некий тяжелый запрос(минуты 2) надо выполнить на нескольких однотипных БД(40 шт.) то получаем совершенно неприемлемое время выполнения 2*40=1ч. 20 мин., если запускать как я, из цикла.

    Задача стоит в том что бы запрос одновременно запустить на всех 40 БД и получить время выполнения 2 мин.
     
  2. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Выполнять обработки отдельными потоками/процессами.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    что значит "отдельные БД"? Это типа несколько разных баз внутри одного сервера? Или это прям разные-разные серверы?
    Если один - то можно создать юзера, который имеет доступ ко всем, и от него можно бахнуть запрос хоть юнионом.

    А то, что их сорок штук - это что-то с архитектурой. Нафига их столько? Надо было не под каждого клиента БД клепать, а делать как обычно - в одну бд.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Быть может попытка шардирования? Ну или просто горизонтально маштабироваться пробуют. Но только накой тогда сразу везде запрос делать?... Накой его в принципе сразу везде делать?
     
  5. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Моя версия: это была попытка партицирования, разделили таблицу по условию, т.к. в ней дохера записей. В любом случае, что партицирование, что шардирование средствами приложения - так себе идея.
     
  6. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Например сведение аналитической информации.

    Сам работал с подобными проектами, только баз было - 30 штук. Каждая из которых имела объем чуть больше 30 терабайт, при том проводилась многоэтапная предварительная агрегация данных на каждой из баз, местами данные проганялись, через OLAP EXASOL. И в конце концов все сводилось в кучу и выполнялась финальная агрегация данных.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    30 тб в реляционной бд это странно пахнет, но у тебя хотя бы понятно, почему их было несколько, но тоже под вопросом.

    Я не думаю, что у ТС такая же ситуация.
     
  8. torm84

    torm84 Активный пользователь

    С нами с:
    17 май 2010
    Сообщения:
    23
    Симпатии:
    0
    Можно чуток раскрыть тему? Мне в голову приходил только вариант опуститься на уровень ОС по средствам exec(), но это как то не элегантно получается, надо будет отслеживать завершение каждого процесса, после это все как то агрегировать и выводить пользователю.

    "Отдельные БД" в моем случае означает что есть один IBM z12, в котором выделено 2 LPAR под z/os(позже z-linux) на каждом из них крутится СУБД oracle, каждая субд управляет 20 БД. С архитектурой все правильно, так и должно быть.

    ЗЫ Это не партицирование и не шардирование, хотя партиции в каждой БД присутствуют.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если они разнесены, их нельзя слепить в одно и "с архитектурой всё правильно", то ответ очевиден и какие могут быть другие варианты - мне вообще представить сложно. =) Фигач запросы, чо ж поделать.
     
  10. torm84

    torm84 Активный пользователь

    С нами с:
    17 май 2010
    Сообщения:
    23
    Симпатии:
    0
    Похоже такая задача решается по средствам многопоточности. Опыту в таком программировании у меня null.

    Расширил свой кругозор статьей https://habrahabr.ru/post/40245/
    Там автор реализует многопоточность по средствам множественных запросов к приложению через механизм web-соккетов. Это уже лучше чем моя задумка с exec(), но в моем случае не понятен вопрос агрегации полученных данных и вывод их пользователю. Можно конечно использовать внешнее хранилище доступное всем потокам аля файл или БД, но это как то кучеряво получается.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    попробуй так: Каждый поток должен сделать как можно больше работы без связи с другими, результаты куда-то скинуть. Потом один поток эти результаты отработает.
     
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Я бы взял ноду, expressjs для простенького api, oracle/node-oracledb и async для того что бы не устроить себе callback hell. Правильные инструменты превращают головняк в идеальные шорты ))
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А что, на ноду промисы не завезли чтоль еще? В браузере они давно есть.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    там есть всё
     
  15. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Завезли конечно, но в async реализованы разные алгоритмы и связанные с этим плюшки. Можно выполнять всё одновременно, можно строго по очереди, можно, к примеру, по 5 штук, ну и прочими извращениями. Бывает что полезно и однозначно более наглядно, к примеру:
    Код (Text):
    1. async.concat(tasks, worker, (err, results) => {
    2.     console.log(results);
    3. });
    Переберет массив tasks, выполнит с каждым элементов функцию worker и соберет весь результат в results.

    Короче, как и всегда это всё можно реализовать и без async, но зачем? )