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

语句没指定order by时,返回记录是否按主键排序?

B哥数据搬运工 2021-05-02
486

    节前信用卡一位同事电话咨询我,他的问题是,如果select一张表,没加order by时,Oracle是否按主键进行排序返回,当时电话里做了解答。趁着放假,写了一个例子,希望能帮助大家了解这一细节。

    下面例子在Oracle 19.5版本,redhat 7.2 x86_64上做的实验。

    1)创建一张测试表,表中有两个字段的类型为char,长度加起来3000节节,即一个数据块8K,只能存两行记录。实验插入50行记录。


    2)查看表的extents分配信息。表的数据是存放在12号数据文件,从0~3号extent,每个extent包含8个数据块。


    3)表的数据块使用情况如下:


    4)表的对象ID为73519


    5)接着,我们以管理员身份清空缓存(注意:这里面为了实验需要,请勿在生产上效仿清缓存,后果自负哈)。


    6)通过10046,我们观察查询语句select ... from tmp_210501的查询结果。我们可以发现以下几个问题:

  • 查询结果集不是按主键进行排序; 

  • B#列可以看到,每个数据块确实存了两行记录;

  • 真正存储业务数据的数据块是从283号块开始,与第2)点的第一个extent 的起始数据块280对不上。原因是表空间是ASSM,采用3级位图,第一个extent至少头部有3个元数据块。

  • 数据的返回顺序与extent的扫描顺序相关。


    7)除了上面直观看到现象外,我们还可以通过前面生成trace文件验证数据是以那种顺序进行读取的。


    相信通过上面的例子,大家能够更深入去了解Oracle。每一个问题,我们都需要想办法去设计场景,去验证我们的推理、或是底层的原理,以数据说话,切忌靠感觉、好象是或是度娘上说的,这往往不靠谱的,也不利于自己深入学习和研究。




文章转载自B哥数据搬运工,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论