【问题标题】:Calling stored procedures slower than simple prepared statements调用存储过程比简单的准备语句慢
【发布时间】:2021-04-26 23:06:21
【问题描述】:

一个问题是影响对我们数据库进行的所有查询,其中通过调用存储过程运行查询需要更长的时间。

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

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 秒以上。是否还有其他可能导致如此巨大差异的原因?

【问题讨论】:

  • 我怀疑开销是调用存储过程 10,000 次。此外,时间可能取决于两个时间比较之间的事务处理方式。
  • 基本查询仍在从准备好的语句运行,所以开销会有很大差异吗?如果有什么我希望存储过程表现更好(我会澄清原来的问题)

标签: java sql oracle query-optimization


【解决方案1】:

这是一个众所周知的问题。当您运行 SQL 语句时,Oracle 在 SQL 引擎中运行它。当您运行执行 SQL 语句的 PL/SQL 过程时,PL/SQL 和 SQL 引擎之间有一个上下文切换。这不是很大,但多次执行会显着降低性能。

Stephen Feuerstein 经常写这篇文章:https://blogs.oracle.com/oraclemagazine/solving-the-row-by-row-problem

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多