ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle是否根据ROWID顺序读取记录(二)

Oracle是否根据ROWID顺序读取记录(二)

Linux操作系统 作者:haiross 时间:2015-01-04 13:51:51 0 删除 编辑

前两天一个学习Oracle时间不长的同事问我,是否Oracle读取记录的时候是按照ROWID顺序的。虽然当时给他大致讲了讲,但是毕竟不是很直观,还是通过一个小例子来说明这个问题。

在做一个DATA OBJECT ID的例子。

Oracle是否根据ROWID顺序读取记录:http://yangtingkun.itpub.net/post/468/473902

 

 

上一篇文章中通过一个例子说明了Oracle读取表数据并非根据ROWID的顺序进行读取。例子采用了构造ROWID信息中BLOCK ID的方式进行了证明,Oracle返回表数据时,可能BLOCK ID小的记录反而稍后返回。

这一篇介绍构造DATA OBJECT ID的例子。

这个例子需要借助Oracle11gINTERVAL分区表:

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分区表是有区别的。具体的描述可以参考:http://yangtingkun.itpub.net/post/468/412717

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是不同的。

 

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

请登录后发表评论 登录
全部评论

注册时间:2013-05-24

  • 博文量
    16
  • 访问量
    34485