发生上下文切换的原因有很多,包括多任务处理和中断。说到Oracle数据库开发,我们一般只指PL/SQL引擎和SQL引擎之间的切换。
在您的示例中,PL/SQL 正在调用 SQL。当 PL/SQL 调用 SQL 时有一次上下文切换,当 SQL 返回到 PL/SQL 时有第二次上下文切换。
PL/SQL 调用 SQL 来解析语句、执行语句或从查询中获取行。我们可以使用 SQL 跟踪工具和称为 TKPROF 的跟踪分析器来测量调用次数。
我创建了一个包含 199 行的表并跟踪了您的代码的执行:
- 有 3 个 PARSE 调用:1 个用于 SELECT,1 个用于 UPDATE,1 个用于 COMMIT。
- 有 2 个 FETCH 调用。当您编写代码时
for i in (select * from employee) loop
,PL/SQL 将自动一次获取 100 行(以减少上下文切换的次数)。
- 有 399 个 EXECUTE 调用:1 个用于 SELECT,199 个用于 UPDATE,199 个用于 COMMIT。
所以从 PL/SQL 到 SQL 有 404 次调用,从 SQL 到 PL/SQL 有 404 次返回,总共进行了 808 次上下文切换。
我们可以通过在循环后提交一次来将上下文切换的数量减少一半。强烈建议避免过于频繁的提交。如果您在 SELECT 循环中提交,您可能会得到与 UNDO 相关的异常不再可用。
通常,减少上下文切换和提高性能的最佳方法是使用基于集合的 SQL。如果做不到这一点,我们可以使用 BULK COLLECT 和 FORALL 一次处理一堆行。
最好的问候,炖阿什顿