В настоящее время я работаю над некоторым приложением 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 сделает любой дополнительный шаг или даже откат (); или что-то?
В конечном счете, я хочу улучшить пользовательский опыт; Как я могу отслеживать этот процесс для них каким-то образом? или, может быть, ускорить его, если есть какой-то очевидный путь? (не забывая, что мои руки вроде как связаны, так как я не контролирую все остальное, что в этом участвует).
Спасибо.
РЕДАКТИРОВАТЬ: Это было не слишком много вопрос, но к основной проблеме: да, это медленно, но только один раз, так как будущие импорты игнорируют строки уже в базе