Наблюдение за ходом выполнения сценария SQL со многими ОБНОВЛЕНИЯМИ в MariaDB - PullRequest
0 голосов
/ 03 октября 2018

Я запускаю сценарий с несколькими миллионами операторов обновления, например:

UPDATE data SET value = 0.9234 WHERE fId = 47616 AND modDate = '2018-09-24'  AND valueDate = '2007-09-01'  AND last_updated < '2018-10-01';

fId, modDate и valueDate - это 3 компонента составного первичного ключа таблицы данных.

Сначала я запустил это с AUTOCOMMIT=1, но я подумал, что оно ускорится, если я установлю AUTOCOMMIT=0 и оберну транзакции в блоки по 25.

В режиме автоматической фиксации я использовал SHOW PROCESSLIST и я вижу инструкцию UPDATE в выходных данных, поэтому по внешнему ключу fId я могу сказать, как далеко продвинулся сценарий.

Однако без автоматической фиксации, наблюдая за ее выполнением сейчас, я не виделчто-нибудь с SHOW PROCESSLIST, просто так:

610257  schema_owner_2  201.177.12.57:53673  mydb  Sleep   0               NULL                    0.000
611020  schema_owner_1  201.177.12.57:58904  mydb  Query   0       init    show processlist        0.000

Статус Sleep делает меня параноиком, что другие пользователи в системе блокируют обновления, но если я запускаю SHOW OPEN TABLES, я не уверен,есть проблема:

MariaDB [mydb]> SHOW OPEN TABLES;
+----------+----------------+--------+-------------+
| Database | Table          | In_use | Name_locked |
+----------+----------------+--------+-------------+
| mydb     | data           |      2 |           0 |
| mydb     | forecast       |      1 |           0 |
| mydb     | modification   |      0 |           0 |
| mydb     | data3          |      0 |           0 |
+----------+----------------+--------+-------------+

Мой сценарий будет ждать вечно?Должен ли я вернуться к использованию режима автоматической фиксации?Есть ли способ увидеть, как далеко он продвинулся?Я думаю, что я могу проверить данные для обновлений, но это было бы трудоемким, чтобы собрать.

1 Ответ

0 голосов
/ 13 октября 2018
  • Проверьте прогресс, фактически проверив данные.
  • Я полагаю, вы делаете COMMIT?
  • Разумно ничего не видеть - каждый UPDATE займеточень мало миллисекунд;будет Sleep время между UPDATEs.
  • Time то, что 0 является вашей подсказкой, что оно прогрессирует.
  • Не обязательно будет какая-либо подсказка в PROCESSLIST того, как далеко он продвинулся.
  • Вы можете добавить SELECT SLEEP(1), $fid; в цикл, где $ fid (или что-то еще) - это последний UPDATEd идентификатор строки.Это замедлит прогресс на 1 секунду на 25 строк, поэтому, возможно, вам следует делать группы по 100 или 500 человек.
...