为啥存储过程要花很长时间才能执行,但过程中的代码自己运行得很快?

Posted

技术标签:

【中文标题】为啥存储过程要花很长时间才能执行,但过程中的代码自己运行得很快?【英文标题】:Why would a stored procedure take forever to execute but the code in the procedure runs quickly on it's own?为什么存储过程要花很长时间才能执行,但过程中的代码自己运行得很快? 【发布时间】:2010-11-23 21:00:32 【问题描述】:

首先,这是甲骨文。如果我这样做......

execute my_package.sp_execute_my_procedure('...', '...');

它似乎无限期地运行(我让它通宵运行)。

但是,如果我从存储过程中获取代码,将其放入 pl/sql 匿名块中,将 declare 关键字放在我的单个游标上并运行它,它会在 10 分钟内完成。需要多长时间。

如果不发布所有代码,至少是马上发布,有没有人见过这样的东西?

更新: 好的,所以我注意到当我从 v$session 中选择时,在运​​行 proc 时,我得到一个“未知”blocking_session_status 事件“直接路径写入临时”。

到目前为止,我通过谷歌搜索还不能完全判断这意味着什么。

【问题讨论】:

程序是做什么的?它可以无限期地等待锁定或其他东西吗? 至少 proc 中没有任何东西可以持有任何锁。它基本上有一个大选择,然后对于选择中的每一行,它都会进行一大堆插入。 【参考方案1】:

包对象可能存在某种争用,甚至在它可以运行代码之前就阻塞了您的会话。

execute 命令挂起时,查询V$SESSION 以查看该会话正在等待什么。

【讨论】:

【参考方案2】:

您的 PL/SQL 代码是否使用绑定变量,而您的 DECLARE 块是否使用文字代替它?这可能会导致不同的计划,从而导致不同的性能。

【讨论】:

PL/SQL 使用作为参数传入的变量,声明块使用绑定变量。【参考方案3】:

但是,如果我从存储过程中获取代码,请将其放入 pl/sql 匿名 块,将 declare 关键字放在我的单个光标上并运行它,它在 10 处完成 分钟。

...

它基本上有一个很大的选择,然后对于选择中的每一行,它都会做一大堆 插入。

您是否包含插入内容?

【讨论】:

是的,它包含了 proc 正在做什么。这是选择和插入。

以上是关于为啥存储过程要花很长时间才能执行,但过程中的代码自己运行得很快?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储过程执行需要很长时间

与 C 和 C++ 相比,为啥 c# 代码需要很长时间才能执行 [关闭]

为啥 popToRootViewContoller 会冻结或需要很长时间才能执行?

编译存储过程遇ddl锁

为啥打开与我的数据库的连接需要这么长时间?

避免花很长时间来完成“牛奶过多”的场景