- 在 9i 中有效的 SQL 语句在 11g 中仍然有效吗?
- 11g 中是否有 9i 中没有的新功能?
- 有效的 9i SQL 语句和 11g 中的相同语句之间是否存在行为差异?
3 回答
在 9i 中有效的 SQL 语句在 11g 中仍然有效。Oracle 非常努力地确保向后兼容。当然,在某些情况下,旧版本的 Oracle 接受了实际上在语法上无效的 SQL 语句,而不是在更高版本正确引发错误的情况下引发错误。但这非常罕见。
如果您对已在不同版本的 Oracle 中添加的功能感兴趣,那么您最好阅读新功能指南的 SQL 语言改进一章和SQL 参考的 SQL 语言一章的新增功能。
如果您要询问行为差异,那主要是对错误假设的依赖。例如,很多人认为
ORDER BY
如果查询包含GROUP BY
. 这绝不是 Oracle 鼓励的假设,但 Oracle 碰巧对数据进行排序以执行GROUP BY
. 在10.2 中添加 hash group by 操作后,Oracle 不再总是将数据排序为数据分组的副产品。这导致许多开发人员不得不返回代码来添加ORDER BY
子句。由于不同的优化器设置,其他 SQL 语句在 11g 中的执行方式不同(特别是如果您从 9i 中的基于规则的优化器迁移)。
在 9i 中有效的 SQL 语句在 11g 中是否仍然有效
在某些情况下,以前有效的 SQL 语句在以后的版本中变得无效。例如,Oracle 8 和 9 之间的 IIRC,该mod
函数用作中缀运算符变得非法;ieselect 12 mod 3 from dual
在 Oracle 8 中有效,但在 Oracle 9select mod(12,3) from dual
中无效。(在两个版本中都有效)
11g 中是否有 9i 中没有的新功能
是的,当然,但列出它们将超出此答案的范围。
有效的 9i SQL 语句和 11g 中的相同语句之间是否存在行为差异
存在可能导致不良“影响”的行为差异。两个例子:
查询优化器。在每个新版本中,由于新的查询优化器可能会选择与旧的查询优化器不同的、劣质的计划,因此某些查询的执行速度可能会显着变慢。
分组依据:在 Oracle 9i 之前,
group by
提供排序结果。(order by
不完全相同order by
的顺序group by
像. 因此,许多开发人员在该子句与该子句order by
相同时省略了该group by
子句。这在 Oracle 10g 中发生了变化,显然 10g 使用哈希表而不是排序树进行分组。正因为如此,一些程序在 10g 中提供的结果与在 9i 中不同。 (注意:忽略预期的排序结果一直是个坏主意)order by
是的当然。查看 Oracle Database SQL Language References 的第一章,例如http://docs.oracle.com/cd/B28359_01/server.111/b28286/wnsql.htm#sthref5