Предоставление обратной связи при выполнении запросов БД - PullRequest
0 голосов
/ 05 марта 2020

В настоящее время я работаю над некоторым приложением CRUD.

По причинам, не зависящим от меня, мне приходится использовать систему с двумя базами данных: oracle одна, «основная» единица, используемая всей компанией, очень тяжелая с тысячами таблиц и ограниченный доступ к нему (я ничего не могу изменить на нем!) и «локальный», созданный специально для моего приложения, используемый только его будущими пользователями (не точно точно, но около 20 ~ люди, я думаю?).

Текущий способ использования приложения; сервер каждую ночь извлекает копию данных, которые он использует, из «основной» базы данных и вставляет ее в «локальную» базу данных. Точно, я выбираю таблицу с 36 столбцами и вставляю ее в свою «локальную» базу данных, где я копирую способ хранения данных (я имею в виду, что там также есть 36 столбцов с одинаковыми типами данных).

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

Мой запрос к серверу oracle извлекает (прямо сейчас) 36 строк за 0,157 секунды:

select A.ID , ... (36 columns trust me)
            from TABLE_NAME A
            where (A.TYPEAFFAIRE = 1 and A.STATUT = 0)
            order by to_number(DECODE(REGEXP_REPLACE(A.REFERENCE, '([[:digit:]]+)', ''), '', A.REFERENCE, null))

Этот запрос был задан мне, но я думаю, что контрольные точки скорее на Mysql ( сервер, на котором он размещен, является обычным настольным компьютером).

//Fetch from oracle
            $sql = "
select A.ID , ... (36 columns trust me)
            from TABLE_NAME A
            where (A.TYPEAFFAIRE = 1 and A.STATUT = 0)
            order by to_number(DECODE(REGEXP_REPLACE(A.REFERENCE, '([[:digit:]]+)', ''), '', A.REFERENCE, null))";

           //prepare the statement and runs it
            $requete = oci_parse($connexion, $sql);
            $result = oci_execute($requete); 



            $stmt = $conn->prepare("INSERT IGNORE INTO vrp_affaire (`ID`, [my 36 cols]) 
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");

Этот шаг очень и очень длинный. Мол, может быть, 15 минут или что-то. Я не буду добавлять его для простоты, но есть другой цикл, повторяющий этот запрос для извлечения вложенных файлов для каждой возвращаемой строки (так что, если много тяжелых файлов, то они очень очень длинные).

У меня также есть опасения, что несколько пользователей могут начать импорт одновременно; я должен создать какой-то механизм блокировки? А что если мой пользователь сыт по горло и закроет страницу, прервет импорт? mysql сделает любой дополнительный шаг или даже откат (); или что-то?

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

Спасибо.

РЕДАКТИРОВАТЬ: Это было не слишком много вопрос, но к основной проблеме: да, это медленно, но только один раз, так как будущие импорты игнорируют строки уже в базе

1 Ответ

2 голосов
/ 05 марта 2020

С моей точки зрения, это неправильно:

Мой запрос для сервера oracle извлекает (прямо сейчас) 36 строк за 0,157 секунды:

Этот запрос - поскольку он извлекает данные из Oracle и вставляет в MySQL, является чем-то вроде

insert into your_table
select 36 columns
from oracle_table
where condition
-- this, below, is wrong!
order by to_number(DECODE(REGEXP_REPLACE(A.REFERENCE, '([[:digit:]]+)', ''), '', A.REFERENCE, null))

Удалить предложение ORDER BY полностью. Если бы это была какая-то простая сортировка ... Ба, оставьте это, но - для большого количества данных, зная, что регулярные выражения медленны, это выглядит неправильно.

Это ничего не помогает, но замедляет вещи вниз Почему вас волнует, в каком порядке строки вставляются в таблицу? Сортируйте их позже, в MySQL, если необходимо, для целей презентации. Но для вставки ... нет пользы, но много боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...