答案是: ROWID顺序
以下是转的测试内容:
[@more@]
创建一个1M的表空间:
SQL> SHOW PARAMETER BLOCK_SIZE
NAME TYPE VALUE
------------------------------------ ----------- -----------------------
db_block_size integer 8192
SQL> CREATE TABLESPACE TEST DATAFILE 'E:ORACLEORADATAYTK102TEST01.DBF' SIZE 1M;
表空间已创建。
下面建立一张表占用数据文件的大部分空间:
SQL> CREATE TABLE T_TEST (ID NUMBER, NAME VARCHAR2(30)) TABLESPACE TEST
2 STORAGE (INITIAL 896K);
表已创建。
去掉数据文件的头信息,这个数据文件只有不到128k的可用空间了,下面创建目标表,为了方便,目标表包含了三个CHAR(2000)的字段,这样每条记录都会占用1个BLOCK,加上表头的三个BLOCK,这张表最大只能插入5条记录:
SQL> CREATE TABLE T_TEST1 (ID NUMBER, C1 CHAR(2000), C2 CHAR(2000), C3 CHAR(2000))
2 TABLESPACE TEST STORAGE (INITIAL 64K);
表已创建。
SQL> INSERT INTO T_TEST1 VALUES (1, 'A', 'A', 'A');
已创建 1 行。
SQL> INSERT INTO T_TEST1 VALUES (2, 'A', 'A', 'A');
已创建 1 行。
SQL> INSERT INTO T_TEST1 VALUES (3, 'A', 'A', 'A');
已创建 1 行。
SQL> INSERT INTO T_TEST1 VALUES (4, 'A', 'A', 'A');
已创建 1 行。
SQL> INSERT INTO T_TEST1 VALUES (5, 'A', 'A', 'A');
已创建 1 行。
SQL> INSERT INTO T_TEST1 VALUES (6, 'A', 'A', 'A');
INSERT INTO T_TEST1 VALUES (6, 'A', 'A', 'A')
*第 1 行出现错误:
ORA-01653: 表 YANGTK.T_TEST1 无法通过 8 (在表空间 TEST 中) 扩展
检查现在的读取顺序:
SQL> SELECT ID, ROWID FROM T_TEST1;
ID ROWID
---------- ------------------
3 AAAPFGAAJAAAAB8AAA
4 AAAPFGAAJAAAAB9AAA
5 AAAPFGAAJAAAAB+AAA
1 AAAPFGAAJAAAAB/AAA
2 AAAPFGAAJAAAACAAAA
可以看到,当前的读取顺序确实不是按照插入顺序进行的,而是根据ROWID的顺序进行的读取。
下面删除刚才建立的T_TEST,插入一条新的记录,再次检查读取顺序:
SQL> DROP TABLE T_TEST PURGE;
表已删除。
SQL> INSERT INTO T_TEST1 VALUES (6, 'A', 'A', 'A');
已创建 1 行。
SQL> SELECT ID, ROWID FROM T_TEST1;
ID ROWID
---------- ------------------
3 AAAPFGAAJAAAAB8AAA
4 AAAPFGAAJAAAAB9AAA
5 AAAPFGAAJAAAAB+AAA
1 AAAPFGAAJAAAAB/AAA
2 AAAPFGAAJAAAACAAAA
6 AAAPFGAAJAAAAAJAAA
已选择6行。
由于数据文件前面的BLOCK被释放,T_TEST1表新扩展的EXTENT的BLOCK_ID要小于原EXTENT的BLOCK_ID,因此ID为6的记录的ROWID明显比前面5条记录的ROWID要小,显然Oracle并不是根据ROWID大小顺序来读取记录的。不过同一个EXTENT中,Oracle是根据这个顺序来读取的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/197458/viewspace-1052643/ ,如需转载,请注明出处,否则将追究法律责任。