监视 SQL 脚本在 MariaDB 中的许多更新的进度
Monitoring progress of a SQL script with many UPDATEs in MariaDB
我正在 运行 编写一个包含数百万个更新语句的脚本,如下所示:
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 是数据 table 的复合主键的 3 个组件。
我最初 运行 使用 AUTOCOMMIT=1
,但我认为如果我设置 AUTOCOMMIT=0
并将 t运行 动作包装成 25 个块,它会加快速度。
在自动提交模式下,我使用了 SHOW PROCESSLIST
并且我会在输出中看到 UPDATE 语句,因此从 fId 外键,我可以知道脚本进行了多远。
但是没有自动提交,现在正在看 运行ning,我还没有看到 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 |
+----------+----------------+--------+-------------+
我的脚本会永远等待吗?我应该回到使用自动提交模式吗?有什么办法可以看到它的进展情况吗?我想我可以检查更新的数据,但将它们放在一起会很费力。
- 通过实际检查数据来检查进度。
- 我假设你正在做
COMMIT
?
- 什么都看不到是合理的 -- 每个
UPDATE
将花费很少的毫秒; UPDATEs
. 之间会有 Sleep
时间
Time
是 0
是你的线索,它正在进步。
- 在
PROCESSLIST
中不一定会有任何线索表明它已经走了多远。
- 您可以在循环中添加
SELECT SLEEP(1), $fid;
,其中 $fid(或其他)是最后一个 UPDATEd
行 ID。这会使每 25 行的进度减慢 1 秒,因此也许您应该以 100 或 500 为一组进行分组。
我正在 运行 编写一个包含数百万个更新语句的脚本,如下所示:
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 是数据 table 的复合主键的 3 个组件。
我最初 运行 使用 AUTOCOMMIT=1
,但我认为如果我设置 AUTOCOMMIT=0
并将 t运行 动作包装成 25 个块,它会加快速度。
在自动提交模式下,我使用了 SHOW PROCESSLIST
并且我会在输出中看到 UPDATE 语句,因此从 fId 外键,我可以知道脚本进行了多远。
但是没有自动提交,现在正在看 运行ning,我还没有看到 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 |
+----------+----------------+--------+-------------+
我的脚本会永远等待吗?我应该回到使用自动提交模式吗?有什么办法可以看到它的进展情况吗?我想我可以检查更新的数据,但将它们放在一起会很费力。
- 通过实际检查数据来检查进度。
- 我假设你正在做
COMMIT
? - 什么都看不到是合理的 -- 每个
UPDATE
将花费很少的毫秒;UPDATEs
. 之间会有 Time
是0
是你的线索,它正在进步。- 在
PROCESSLIST
中不一定会有任何线索表明它已经走了多远。 - 您可以在循环中添加
SELECT SLEEP(1), $fid;
,其中 $fid(或其他)是最后一个UPDATEd
行 ID。这会使每 25 行的进度减慢 1 秒,因此也许您应该以 100 或 500 为一组进行分组。
Sleep
时间