【问题标题】:How to figure out when a SQL query will end?如何确定 SQL 查询何时结束?
【发布时间】:2015-02-24 13:42:45
【问题描述】:

有什么方法可以确定 SQL 查询在开始后何时结束?换句话说,有什么方法可以计算出在查询执行之前查询需要多长时间? (粗略估计没问题!)

ALTER IGNORE TABLE mytbl ADD UNIQUE (c);

我在有 3500 万条记录的 innodb 表上运行了这个查询。 c 是 varchar(255)

这个命令已经运行了 10 个小时,它仍然在运行。如果我接近尾声,我不想取消。

感谢您的帮助。谢谢!

【问题讨论】:

  • @ÁlvaroG.Vicario 它显示了自查询开始以来的持续时间。我的问题完全不同。我不明白你为什么要提到它?
  • 没有。没有办法看到这一点,因为查询的运行时间取决于 mysql 本身以外的许多其他因素(如空闲 CPU 资源、空闲 RAM 等)。
  • @bksi - 原则上没有理由不能提供此信息。在 SQL Server 中,您可以通过查看 DMV 来了解有多少行已写入新索引中途,这有助于了解它有多远。
  • 请注意SQL is turing complete,所以can't be possible 来决定一个任意命令是否会停止——或者,通过扩展,何时它会停止会这样做的。

标签: mysql sql database


【解决方案1】:

摘自ServerFault解决方案:

解决方案是测量查询在事实表的表扫描中扫描行的速度。这由 Handler_read_rnd_next 状态变量显示。这是一种简单的观看方式(innotop 是另一种方便的方式):

mysqladmin extended -r -i 10 | grep Handler_read_rnd_next
-- ignore the first line of output...
| Handler_read_rnd_next             | 429224      |

所以服务器每秒读取大约 43K 行,表中有 1.5 亿行。稍加数学运算,您将在 3488 秒内完成,或不到一个小时。事实上,查询在大约 55 分钟内完成。

【讨论】:

  • 接近每秒 430K 行,而不是 43K。
  • -i 10 每 10 秒为您提供一次更新。所以它是每 10 秒 430k,或每秒 43k。
【解决方案2】:

这里最大的问题是(到目前为止)确定查询需要多长时间的最重要因素与查询本身无关。相反,决定答案的最大因素是查询运行时数据库上的负载,尤其是来自其他查询的负载。对于活动系统上的复杂查询,此负载甚至可能在查询过程中发生显着变化。

您可以使用EXPLAIN 关键字为您的查询获取执行计划。您可以使用它来获得一个相对的想法,在所有其他条件相同的情况下,特定查询可能会花费多少。但是,即使在这里,MySql 也不是很容易,因为它不会像 sql server 那样为您提供一个不错的计划成本或可以使用的执行时间数字。您需要根据行和磁盘读取来推断这些数字。

同样,即使您生成了估计成本然后运行查询,您也可能在比预期更长或更短的时间内获得结果,因为在创建估计之后和查询运行时服务器上的负载会发生变化。


在这种情况下,10 小时后,听起来您可能遇到了阻塞/锁定问题。如果您有另一个使用此表的活动(可能长时间运行或经常重复)查询,请尝试终止它,您的查询很可能会在几分钟后自然完成。

【讨论】:

    【解决方案3】:

    使用测试数据库,较小的数据集。
    这将产生一个非常粗略的估计。 但我相信在你的情况下,时间将是非线性的,例如:指数。 也许您可以重新编写命令,以便保证唯一的 c。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多