调用存储过程比简单的准备语句慢

Calling stored procedures slower than simple prepared statements

一个问题影响了对我们数据库的所有查询,当 运行 通过调用存储过程时,查询花费的时间要长得多。

这似乎通常是一个参数嗅探问题,但对于我一直用来测试根本不使用参数的性能的虚拟查询,我仍然看到这个问题。例如执行

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 和 [=19] 之间有一个 上下文切换 =] 引擎。这不是很大,但是重复多次会显着降低性能。

Stephen Feuerstein 写了很多关于这个的文章:https://blogs.oracle.com/oraclemagazine/solving-the-row-by-row-problem