表和索引的结构(笔记)

页是sql server存储数据的基本单位,大小为8k.(1024*8=8192字节),标头(header)占96个字节,在页尾维护的行指针占2个字节,还有其他几个保留的字节以备后用。行的小大为8060字节(大型对象数据除外),当行超过8060字节时,这些类型的值将被移动到一个称为行溢出分配单元的页中,而在原始页上保留一个24字节的指针,指向行外的数据。这样行就跨了多个页,但行内的数据仍然在8060字节的限制内。

页是sql server可以读写的最小i/0单位,即使只须访问一行,sql server也要把整个页加载到缓存,再从缓存中读取数据。

区是由8个物理上连续的页组成的单元。当表或索引需要更多的空间以存储数据时,sql server为对象分配一个完整的区。对于包含少量数据的对象,有一个例外:如果对象不足64KB,则当需要更多的空间时,sql server通常只分配一个单独的页,而不是整个区。页可以位于一个混合区内,混合区的8个页属于不同的对象。一些数据删除操作,如删除(drop)表或者清空(truncate)表,将释放整个区,这些操作将最小限度地被记录,因些,它们比完整记录日志的delete语句要快得多。些外一些读操作,如通常用于大型表或索引扫描的预读(read-ahead),可以在区级别,或是在更高的块级别上读取数据。 i/0操作中开销最大的部分是磁盘臂(disk arm)的移动,而真正的磁盘读写操作的开锁要小得多:因此读一个页和读取整个区所有的时间几乎一样长。

表的组织方式

表有两种组织方式:堆或b树。

当在表上创建一个聚集索引时,表就组织为一个b树;否则就组织为一个堆。因为表必须按这两种方式中的一种进行组织(堆或b树),所以表的组织方式也称为HOBT.无论表是如何组织的,都可以在表上定义0个或多个非聚集索引。

非聚集索引总是组织为b树。HOBT,以及非聚集索引可以在一个或多个称为分区(partition)的单元上实现。从技术上说,各分区上的HOBT和每个非聚集索引可以是不相同的。每个HOBT和非聚集索引的各分区将数据存储在称为分配单元(allocation unit)的一组页中。分配单元有下列三种类型:

IN_ROW_DATA,ROW_OVERFLOW_DATA,LOB_DATA.IN_ROW_DATA用于存储所有固定长度的列,以及可变长的列(只要行大小不超过8060字节的限制)

ROW_OVERFLOW_DATA用于存储不超过8000字节的varchar,nvarchar,varbinary,SQL_VARIAN和CLR用户自定义类型的数据,但因为行大小超过了8060字节的限制,而从原始行移动到了这里。LOB_DATA用于存储大型对象数据类型值。

分配单元中存储的页集合由系统视图sys.system_internals_allocation_units中的页指针定位。

原文地址:https://www.cnblogs.com/heqianjin/p/2590908.html