暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 无订单子句的排序顺序

ASKTOM 2021-01-28
234

问题描述

你好,团队,
我了解,在不指定ORDER BY子句的情况下,Oracle不保证select查询的排序顺序。但是,我正在尝试寻找公司面临的特定情况的原因

我们有一个生产数据库 (比方说ORMP),为了开发目的,我们有4个开发数据库ORMD/T/OCMD/T,这是ORMP在不同时间范围内的副本。在这些数据库中的每个数据库中都有一个表格TABLE1。该表有许多列,例如COL1,COL2,COL3等,其中COL1由序列填充,并且是主键

我们在这些开发数据库中的4个数据库中运行如下查询,所有数据库都在同一个oracle版本11g R2上

SELECT COL1, COL2, COL3 from ABC.TABLE1 WHERE COL3 = 'TEST' ORDER BY COL2;


此查询在前3个数据库中以COL1 (序列Id列) 的递增顺序返回数据,但在第4个数据库中不返回。我们多次重复此操作,但是我们得到的结果与上面提到的顺序相同

我已经向团队解释了排序顺序不能保证在COL1上,因为它不包含在order BY子句中,但是我无法解释为什么我们在3个数据库中获得相同顺序的数据,除了最后一个。

您能否分享您对如何解释这种行为的想法?

如果您需要更多信息,请告诉我。

谢谢,
Manoj

专家解答

我猜数据库将行存储在不同的physical订单。即它们在磁盘上的位置。例如:

create table t as 
  select level c1, 1 c2 
  from   dual
  connect by level <= 10
  order by level;
  
select * from t
order  by c2;

C1    C2   
    1     1 
    2     1 
    3     1 
    4     1 
   10     1 
    6     1 
    7     1 
    8     1 
    9     1 
    5     1 
  
drop table t purge;
create table t as 
  select level c1, 1 c2 
  from   dual
  connect by level <= 10
  order by level desc;
  
select * from t
order  by c2;

C1    C2   
   10     1 
    9     1 
    8     1 
    7     1 
    1     1 
    5     1 
    4     1 
    3     1 
    2     1 
    6     1 


这凸显了非确定性排序的危险。各种操作可以改变行的物理位置,从而导致不同的结果。差异还有其他可能的原因,例如不同的执行计划。

最终这并不重要why数据库给出了不同的结果。对相同数据的相同查询在不同数据库中以不同顺序返回行这一事实应该足以说服人们修复他们的查询!
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论