如何解决调用存储过程比简单的准备语句慢
一个问题正在影响对我们的数据库进行的所有查询,其中通过调用存储过程运行查询需要更长的时间。
这似乎通常是一个参数嗅探问题,但对于我一直用来测试根本不使用参数的性能的虚拟查询,我仍然看到这个问题。例如,执行
UPDATE TestTable
SET field = 'test'
WHERE id = 1;
从准备好的语句 10000 次调用需要 0.6 秒
PROCEDURE plsqlTest(...)
AS
BEGIN
UPDATE TestTable
SET field = 'test'
WHERE id = 1;
END plsqlTest;
同样的数量需要 20 多秒。是否还有其他原因可能导致如此巨大的差异?
解决方法
这是一个众所周知的问题。当您运行 SQL 语句时,Oracle 在 SQL 引擎中运行它。当您运行执行 SQL 语句的 PL/SQL 过程时,PL/SQL 和 SQL 引擎之间存在上下文切换。这不是很大,但如果多次执行会显着降低性能。
Stephen Feuerstein 对此写了很多:https://blogs.oracle.com/oraclemagazine/solving-the-row-by-row-problem
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。