2013-03-13 36 views
0

声明:我知道当需要排序数据时,在SQL中不使用'ORDER BY'是不好的。Oracle排序顺序 - 什么可能导致它改变

我目前正在支持一个Pro * C程序,它有一个奇怪的问题。 奇怪问题的一个可能原因可能是原始开发人员(很久以前)在其SQL中没有使用ORDER BY,即使程序逻辑依赖于它! 这些年来该计划一直工作得很好,最近才开始显示问题。

我们试图将错误问题归咎于ORDER BY错误(还有其他一些原因,例如从Solaris到Linux发生的最近端口)。

我们应该看看数据库端有什么阴影可能改变了旧的排序顺序?数据文件等东西? 任何人都有使用Solaris上Pro * C的经验,对结果集进行神奇排序?

谢谢!

回答

2

既然您知道该程序关心的结果返回的顺序,并且您知道提交的查询缺少ORDER BY子句,是否有一个原因,您不只是解决问题而不是寻找问题试图找出结果的实际顺序是否可能发生了变化?如果你修复已知的ORDER BY问题和你已经消失的“怪异问题”,那将提供一些相当好的证据,证明“奇怪问题”实际上是由缺失的ORDER BY引起的。

不幸的是,有很多事情可能导致结果顺序改变,其中许多可能无法追查。最明显的原因是执行计划的改变。反过来,这可能是因为统计数据发生了变化,或者由于统计数据变化不够或者由于修补程序或初始化参数更改或客户端配置更改等因素造成的。如果您有权使用AWR(自动工作量资料档案库),则可以通过查看DBA_HIST_SQLSTAT在不同日期的SQL_ID的多个PLAN_HASH_VALUE值,找到证明计划已更改的证据。如果存在,您仍然需要尝试确定不同的计划是否实际上导致结果以不同的顺序返回。除了查询计划更改外,还有其他几十种可能的原因。磁盘上数据的物理顺序可能已经发生变化,因为有人重新组织了该表,或者因为某人在磁盘上移动了数据文件,或者因为SAN通过移动数据自动重新平衡某些内容。一些数据可能已被缓存(或可能未被缓存),一般在过去被缓存。Oracle补丁可能已经被应用。

+0

感谢您的回答!我将对AWR和计划进行更多的研究。 我已经更改了代码,但需要一周的时间才能知道是否解决了问题。很难告诉用户,一个星期后问题仍然没有解决:( – dvlpr 2013-03-13 10:08:56

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和向汤姆的回答,似乎是因为Oracle不保证默认排序,如果你不使用“ORDER BY”,他们可以自由改变它。他们当然是绝对正确的。如果您需要排序,请使用Order By。

除此之外,我们不能说你的代码或默认顺序。

+0

是的,但我遇到的问题不在于解决它。我可以将ORDER BY添加到程序中。 问题在于确定我是否正在解决正确的问题。为此,我需要检查导致订单更改的数据库端发生了什么变化。 – dvlpr 2013-03-13 08:14:16

+0

只有你可以告诉DB @dvlpr发生了什么,这里的人们只能猜测。例如;你最近升级了它吗?应用补丁?改变了一些初始化参数? – Ben 2013-03-13 08:16:28

+1

没有用户干预数据库,没有升级,没有修补程序等。 我在寻找的是'可能'导致数据文件,分区等来自您过去的经验。 (我说可能是因为我认为这没有记录)。 – dvlpr 2013-03-13 08:24:54

相关问题