前两天一个学习Oracle时间不长的同事问我,是否Oracle读取记录的时候是按照ROWID顺序的。虽然当时给他大致讲了讲,但是毕竟不是很直观,还是通过一个小例子来说明这个问题。
在做一个DATA OBJECT ID的例子。
上一篇文章中通过一个例子说明了Oracle读取表数据并非根据ROWID的顺序进行读取。例子采用了构造ROWID信息中BLOCK ID的方式进行了证明,Oracle返回表数据时,可能BLOCK ID小的记录反而稍后返回。
这一篇介绍构造DATA OBJECT ID的例子。
这个例子需要借助Oracle11g的INTERVAL分区表:
SQL> CREATE TABLE T_PART_INTERVAL
2 (ID NUMBER,
3 NAME VARCHAR2(30))
4 PARTITION BY RANGE (ID)
5 INTERVAL (1)
6 (PARTITION P1 VALUES LESS THAN (2));
表已创建。
对于这种INTERVAL的分区表,有一个特点,Oracle根据插入数据来自动创建所需的分区,也就是说并非分区列上限值小的分区一定先创建,这和普通的RANGE分区表是有区别的。具体的描述可以参考:
SQL> INSERT INTO T_PART_INTERVAL VALUES (1, 'A');
已创建1行。
SQL> INSERT INTO T_PART_INTERVAL VALUES (3, 'A');
已创建1行。
SQL> INSERT INTO T_PART_INTERVAL VALUES (2, 'A');
已创建1行。
SQL> COMMIT;
提交完成。
在插入数据的时候先插入3,后插入2,这样就会导致Oracle先创建RANGE上限值为4的分区,后创建上限值为3的分区。
SQL> SELECT ROWID, ID, NAME FROM T_PART_INTERVAL;
ROWID ID NAME
------------------ ---------- ----------------------------------------
AAAa4oAAFAAABd2AAA 1 A
AAAa4qAAFAAABeCAAA 2 A
AAAa4pAAFAAABd8AAA 3 A
Oracle仍然是根据RANGE的大小顺序读取分区,这样就导致了读取顺序了DATA OBJECT ID是不同的。