【发布时间】:2011-12-14 00:13:49
【问题描述】:
我一直试图弄清楚我收到的一组查询出了什么问题,但我现在很困惑。
它应该在一个由 GUI 应用程序调用的存储过程中。
只有一个“小”问题,首先是一个简单的UPDATE,然后是使用SELECT 和子选择的INSERT,最后是另一个UPDATE。手动一起运行这些查询,我得到的总执行时间为 0.057 秒,不算太简陋。
现在,我尝试创建一个存储过程,其中包含这些查询和五个输入变量,我运行此过程,第一次尝试花费了 47.096 秒,随后对其调用显示了相似的执行时间(35 到 50 秒)。从 MySQL Workbench 运行单个查询仍然显示不到 0.1 秒的执行时间
这些查询真的没有什么花哨的,那么为什么存储过程需要很长时间才能执行,而查询本身只需要几分之一秒呢?我在这里缺少某种 MySQL 特性吗?
其他测试结果:
似乎如果我在 MySQL Workbench 中运行查询但使用变量而不是仅仅将变量的值放入查询中,它的运行速度与存储过程一样慢。所以我尝试将存储过程更改为只使用静态值而不是变量,然后它突然运行得非常快。显然,由于某种原因,使用变量使其运行速度极慢(例如,当我直接在查询中使用变量的值时,第一个 UPDATE 查询从三个变量的大约 0.98 秒变为 0.04-0.05 秒,而不管如果它在存储过程中或直接运行查询)。
所以,问题不在于存储过程,而与我对变量的使用有关(这是不可避免的)。
【问题讨论】:
-
我们需要查看一些代码。第一个疯狂的猜测会是你在声明/处理变量时所做的一些奇怪的事情......但这是一个完全疯狂没有看到一些代码的猜测。
-
正如我所说,非常简单的查询可以自行运行非常快,只需
UPDATE table SET column = variable WHERE othercolumn >= othervariable OR othercolumn = yetanothervar输入内容。并且变量以常规IN varname COLUMNTYPE(SIZE)形式声明为存储过程的参数。让我感到困惑的是,没有什么奇怪或缓慢的(是的,我避免显示代码是因为我的老板可能对我这样做感到恼火)。 -
我可以提一下,除了第一个
UPDATE查询(它本身运行时间不到 0.05 秒,然后运行存储的 proc 仍然给出大约 1 秒的执行时间,上面的评论是非常恰当地描述了UPDATE的复杂程度......
标签: mysql sql stored-procedures