我们刚刚经历了这个,尽管我们分两步完成了——去年从 9 到 10,然后今年从 10 到 11。我会尽量回忆我们的发现:
A.如果您有带有 GROUP BY 的查询,您需要添加匹配的 ORDER BY,因为较新版本的 Oracle(通常)不会在 GROUP BY 处理期间放入 SORT 步骤。换句话说,如果有类似的查询
SELECT * FROM SOME_TABLE
GROUP BY FIELD_1, FIELD_2
您需要将其更改为
SELECT * FROM SOME_TABLE
GROUP BY FIELD_1, FIELD_2
ORDER BY FIELD_1, FIELD_2
B.我建议您将 9.x 数据库的副本保留一段时间,以便将在 9 下生成的计划与在 11 下生成的计划进行比较。11.x 中的优化器可以评估一些与 9.x 或 10 截然不同的查询.x 会。我们发现我们为 10.x 适当提示的较大查询之一在 11.x 下运行非常缓慢。经过一个下午的开发人员和 DBA 的努力,我们发现 ORDERED 提示恢复了原来的计划和性能。
C.如果您有任何代码明确设置为通过执行类似的操作来使用基于规则的优化器
alter session set optimizer_goal = rule
您将收到一条错误消息,告诉您基于规则的优化器已过时。
D.创建集合但不对其进行初始化的 PL/SQL 代码可能在 9.x 下工作,但在 11.x 下会失败。一个例子是
TYPE tMyArray IS VARRAY(100) OF VARCHAR2(100);
arrMyArray tMyArray; -- <-- uninitialized array
要解决此问题,您需要将变量声明更改为
arrMyArray tMyArray := tMyArray('');
出于参考目的,9 -> 10 升级是最多的工作。 10 -> 11 几乎是不费吹灰之力的(除了一些有问题的查询 - 见 B)。