对于插入记录,插入到堆表中的所有数据会加到该表的尾部。sybase 利用sysindex表的indid(=0)和root值,找出该表的最后一个数据页。如果在该页上有空间,在数据的尾部插入新的记录行。如果最后一页上没有可获得的空间时,如果在该扩展单元的下一页有可获得的空间,这是用它;如果最后一页已经是扩展单元的最后一页,则开始使用一个新的扩展单元,对于新加入的页总是会链到链表的尾部,同时更新sysindex.root的值。
对于记录删除,当删除一条记录时,页内紧随被删除记录后的记录向该页前部移动,所有未使用的空间相邻地保留在页的底部。当一页中所有行均被删除,这一页就会脱离该堆表的数据链。
对于更新,堆表按下面的原则:
· 如果行的长度没有变化,就在原来的行上直接更新,并且没有页内数据的移动。
· 如果行的长度变化,并且页的空闲空间足够。行还是在页上的相同位置,但是其它行将上移或下移以保持页内行的连续。
· 如果该页不能容纳行。在allpages-locked堆表中,行会被删除,并且“新”行插入到最后页。data-only-lockedthe 堆表中,行插入到另外的页中,在原来的位置采用转向指针指到该页面,这样保证行的id位置不变。
对于扫描,按sysindex.first <-> sysindex.root链表方式读取数据页。
对于堆表,根据上述插入、删除、更新、扫描特性,可以得到下面的结论: