结果集按rownum排序的分析

本文探讨了Oracle数据库中查询结果的排序方式,特别是未指定排序条件时,默认按ROWID进行排序的现象,并通过创建表及查询ROWID的方式验证了这一结论。

一次无意中发现查询的结果集按rownum从下到大排序,不知道什么原因,开始想跟object_id,user_id有关,可是查了下发现没有关系。

SQL> select username,rownum,user_id from dba_users where username like 'D%';
 
USERNAME            ROWNUM    USER_ID
--------------- ---------- ----------
DBSNMP                   1         24
DEPLOYOP                 2         71
DCFSDATA                 3         66
DCFSCDE                  4         67
DCFSOPR                  5         68
DBMGR                    6         56
DMLBAK                   7         73
DBCONN                   8        115
DIP                      9         19
DMSYS                   10         35
 
10 rows selected
 
SQL>
 
SQL> select username,rownum,user_id from dba_users where username like 'D%' order by 1;
 
USERNAME            ROWNUM    USER_ID
--------------- ---------- ----------
DBCONN                   8        115
DBMGR                    6         56
DBSNMP                   1         24
DCFSCDE                  4         67
DCFSDATA                 3         66
DCFSOPR                  5         68
DEPLOYOP                 2         71
DIP                      9         19
DMLBAK                   7         73
DMSYS                   10         35
 
10 rows selected


那就怀疑是不是跟rowid有关的,做了个实验试试了,如下:

create tablespace dbmgrdata
  logging
  datafile '/paic/stg/merge2/oradata/ls06bj/dbmgrdata01.dbf' size 500m
  autoextend off
  extent management local
  segment space management auto ;
 
SQL>

Tablespace created

SQL> @tbs dbmgrdata


BYTES/1024/1024    FILE_ID FILE_NAME                                                                        AUTOEXTENSIBLE MAXBYTES/1024/1024/1024
--------------- ---------- -------------------------------------------------------------------------------- -------------- -----------------------
            500        168 /paic/stg/merge2/oradata/ls06bj/dbmgrdata01.dbf                                  NO                                   0


SQL> drop table users;

Table dropped

SQL> create table users as select * from dba_users;

Table created

 

SQL> select * from dba_objects where object_name='USERS';

OWNER   OBJECT_NAME  SUBOBJECT_NAME   OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED     LAST_DDL_TIME TIMESTAMP           STATUS  TEMPORARY GENERATED SECONDARY
------- --------------------------------------- -------------- ----------------------- ------------- ------------------- ------- --------- --------- ---------
DBMGR   USERS                            177305         177305 TABLE       10/22/2010  10/22/2010 12 2010-10-22:12:51:37 VALID   N         N         N

SQL>
SQL>
SQL>
SQL> select rowid,rownum,USERNAME
  2    from USERS
  3   where rowid between dbms_rowid.rowid_create(1, 177305, 168, 0, 0) and
  4         dbms_rowid.rowid_create(1, 177305, 168, 9999999, 0)
  5         and rownum<21;

ROWID                  ROWNUM USERNAME
------------------ ---------- ------------------------------
AAArSZACoAAAAAMAAA          1 SYS
AAArSZACoAAAAAMAAB          2 SYSTEM
AAArSZACoAAAAAMAAC          3 OUTLN
AAArSZACoAAAAAMAAD          4 DIP
AAArSZACoAAAAAMAAE          5 TSMSYS
AAArSZACoAAAAAMAAF          6 DBSNMP
AAArSZACoAAAAAMAAG          7 WMSYS
AAArSZACoAAAAAMAAH          8 EXFSYS
AAArSZACoAAAAAMAAI          9 LBACSYS
AAArSZACoAAAAAMAAJ         10 TRACESVR
AAArSZACoAAAAAMAAK         11 ACCTLNK
AAArSZACoAAAAAMAAL         12 ACCTMAN
AAArSZACoAAAAAMAAM         13 ACCTOPA
AAArSZACoAAAAAMAAN         14 ACTRESV
AAArSZACoAAAAAMAAO         15 ARMAN
AAArSZACoAAAAAMAAP         16 CCSQRY
AAArSZACoAAAAAMAAQ         17 CHNL_TRANS
AAArSZACoAAAAAMAAR         18 DATAVIEW
AAArSZACoAAAAAMAAS         19 CRMQRY
AAArSZACoAAAAAMAAT         20 DBVIEWER

20 rows selected

SQL>

从上面可以看到果然是跟rowid有关,是按rowid的序列排序的

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15779287/viewspace-676539/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15779287/viewspace-676539/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值