为啥存储过程要花很长时间才能执行,但过程中的代码自己运行得很快?
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 正在做什么。这是选择和插入。以上是关于为啥存储过程要花很长时间才能执行,但过程中的代码自己运行得很快?的主要内容,如果未能解决你的问题,请参考以下文章
与 C 和 C++ 相比,为啥 c# 代码需要很长时间才能执行 [关闭]