Oracle排序 - 可能导致其更改的原因

时间:2013-03-13 08:08:19

标签: linux oracle11g sql-order-by

免责声明:我知道在需要排序数据时不要在SQL中使用'ORDER BY'是不好的。

我目前正在支持一个有着奇怪问题的Pro * C程序。 可能导致奇怪问题的原因之一可能是原始开发人员(很久以前)在他们的SQL中没有使用ORDER BY,即使程序逻辑依赖于它! 这些年来,该计划一直运作良好,并且最近才开始出现问题。

我们正在尝试将错误问题归结为ORDER BY错误(还有其他原因候选者,例如最近发生从Solaris到Linux的端口)。

我们应该看一下数据库端的哪些阴影可能会改变旧的排序顺序?像数据文件等? 有没有人对Solaris上的Pro * C有过神奇排序结果集的经验?

谢谢!

2 个答案:

答案 0 :(得分:2)

既然你知道程序关心的是返回结果的顺序,并且你知道提交的查询缺少ORDER BY子句,那么你是否有理由不解决问题而不是试图弄清楚结果的实际顺序是否可能已经改变?如果你修复了已知的ORDER BY问题和“奇怪的问题”,你就会消失,这将提供一些很好的证据,证明“奇怪的问题”实际上是由缺失的ORDER BY引起的。 / p>

不幸的是,有很多事情可能导致结果的顺序发生变化,其中很多可能无法追查。最明显的原因是执行计划的变化。反过来,这可能是因为统计信息发生了变化,或者因为统计信息没有发生足够的变化,或者是因为补丁或初始化参数发生变化,或者是因为客户端配置发生了其他变化。如果您被许可使用AWR(自动工作负载存储库),您可以通过查看PLAN_HASH_VALUESQL_ID的多个DBA_HIST_SQLSTAT值来查找计划已更改的证据。 1}}在不同的日子里。如果有,你仍然需要弄清楚不同的计划是否真的导致结果以不同的顺序返回。但是,除了查询计划更改之外,还有许多其他可能的原因。磁盘上数据的物理顺序可能已更改,因为有人重新组织了表,或者因为有人在磁盘上移动了数据文件,或者因为SAN通过移动数据自动重新平衡了某些内容。在过去,现在缓存的某些数据可能已缓存(或者可能尚未缓存)。可能已应用Oracle修补程序。

答案 1 :(得分:0)

我建议您使用视图更改物理表,并在该视图中进行所需的订单。

例如

TABLE_NOT_SORTED - >重命名为 - > PHYS_TABLE_NOT_SORTED

CREATE VIEW TABLE_NOT_SORTED 
AS
SELECT * FROM PHYS_TABLE_NOT_SORTED
ORDER BY DESIRED_COLUMNS

对评论的回复:

根据this question和Ask Tom的答案,似乎由于Oracle不保证默认排序,如果你不使用“ORDER BY”,他们可以自由更改它。他们绝对是对的。如果您需要排序,请使用Order By。

除此之外,我们无法对您的代码或默认排序做任何说明。

相关问题