首页 > 数据库 > Oracle > 正文
1.2.2 典型问题:堆表是有序的吗
2015-04-01 15:57:31     我来说两句      
收藏    我要投稿

曾经有位开发人员跟我聊到,他曾做过测试,插入几万行,删掉,再插入,发现原来Oracle中堆表是按插入顺序安排行的位置的,而且这个测试他做了好多遍,都是这个结果。现在他们有个应用,显示数据时,要求先插入的行在前,后插入的行在后,其实Oracle已经帮他们实现了这个功能。

事实上,堆表是无序的,堆表的特点就是无序、插入快速。

Oracle在插入行时是如何在数据块内查找可用空间的呢?这有点类似于上节中提到的区的分配过程。Oracle会在数据块中设立一个标记位,记录空间使用到哪儿了。

块中用户数据所占空间是从下往上分配的。假设,在8192字节的块中插入了5行,每行100字节,也就是说,空间已经使用到了(8192-500)7692字节处,那么,标记位的值就是7692。

如果删除了其中一行并提交,标记位的值不会变,还是7692。再重新插入被删除行,或插入新行,将会从7692处向上查找可用空间,删除行释放出的空间不会被使用。

当标记位的值越来越小,向上到达管理性信息的边界时,标记位会再变为8192。

我们可以测试一下。
 

SQL> delete lhb.table_lhb2 where id=2;
1 row deleted.

SQL>commit;
Commit complete.

SQL> insert into lhb.table_lhb2 values (2,'ABC');
1 row created.

SQL> commit;
Commit complete.

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.rowid_block_
number(rowid) block_id,dbms_rowid.ROWID_ROW_NUMBER(rowid) row_id,id from lhb.
table_lhb2;
       FNO   BLOCK_ID     ROW_ID         ID
---------- ---------- ---------- ----------
         5        517          0          1
         5        517          2          3
         5        517          3          4
         5        517          4          2<------删除提交后再插入,
						被分配到了新的位置


在上面的测试中,先删除ID为2的行,提交后接着又插入ID为2的行。不过,新插入的行并没有使用刚刚删除行的空间。

如果只测试到这一步,很容易得出结论,行的位置就是插入顺序。但别忘了,我们只在一个块内进行了观察,查找了可用空间。在众多的块中,Oracle是如何选择要向哪个块中插入的呢?情况会不会有变化呢?我们还不知道。

所以,现在还不能完全回答“堆表是有序的吗”这个问题,继续向下看,据说ASSM对插入的影响是巨大的,那接下来看看ASSM。


 



点击复制链接 与好友分享!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.2.1 块中空间的使用
下一篇:1.2.3 ASSM与L3、L2、L1块的意义
相关文章
图文推荐
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站