3.堆不是按照特定顺序来维护的,所以新增加到列表中的行可以保存到任何数据页上。SQL Server使用页可用空间页(PFS,Page Free Space)的位图来跟踪数据页中的可用空间,以
便可以快速地找到有足够空间能够容纳新行的页面,如果这样的页面不存在,则分配一个新页面,对于长度可变的列进行更新时,行的大小就会扩展,页可能会因为没有空间而无法容纳
新增加的行,此时,SQL Server 会把扩展后的行移动到具有足够空间的页上,而在原来的位置上保留一个所谓的正向指针(forwarding pointer),,通过它指向行的新位置。
(三)区
区是由8个物理连续的页组成的单元。当表或索引需要更多的空间以存储数据时,SQL Server为对象分配一个完整的区。
1.对于包含少量数据的对象,当对象不足64KB时,SQL Server通常只分配一个单独的页,而不是整个区
2.区按存储是否为同一对象,可分为混合区(区8个连续的页存储不同对象)和非混合区(区8个连续的页存储相同的对象)
3.当删除(delete)或清空(Truncate)表时,将会释放区
4.一些读操作,如大型表或索引扫描的预读(read-ahead),可以在区级别,或更高的快级别读取数据
5.I/O操作最大的开销是磁盘臂的移动,而真正的磁盘读写操作开销要小得多,因此,读取一个页和读取一个区所用得时间几乎一样
(四)B Tree
B树是一种存储结构,如B+Tree,B-Tree,其中,B-Tree是我们重点关心的,B-Tree是一种平衡树,主要用来存储聚集索引相关数据的,在这里不重点论述,只要知道有这么个概念即可,
在索引(Index)章节,我会重点论述。
(五)行数据、溢出数据和其他数据
详见本篇博文第四部分。
四 页的基本构成
通过前面几节介绍,我们知道,页是存储的最小单位(其实,页也是IO的最小单位,每次从磁盘DB中读取数据到缓冲池,都是以页为单位读取的),那么SQL Server中的Page又是什么呢?它
的基本结构又是怎样的呢?下图为SQL Server中,一个Page的基本构成。
(一)页描述
页是SQL Server存储数据的基本单位,大小为8KB,它可以包含表或索引数据、分配位图、可用空间信息等。在SQL Server中,页是数据存储的最小单位,也是数据读取的最小IO。
(二)页的基本构成
SQL Server Page主要由四部分构成,页头(Page Header),数据行(Data Row),空闲区(Free)和偏移量(Offset)。
1.页是数据存储的最小单位,页是数据读取的最小IO;
2.一个页的大小为8KB,其中页头占据96B(96个字节),页尾维护的行指针占据2B(2个字节),还有其他保留字段以备后用。
3.SQL Server 2005后,为了满足VARCHAR,NVARCHAR,VARBINARY,SQL_VARIANT和CLR用户定义类型,放宽了对行大小的限制,这个技术就叫做行溢出数据。
4.行溢出数据,指当行超过8060字节时,这些类型的值将被移动到一个成为行溢出分配单元中的页中,而在原始页上保留一个24字节的指针,指向行外的数据,如此,行就
可以跨多个页,但行内数据任然在8060字节限制内。如果类型值在8000字节以内,它们的值将被移动到行溢出页中;如果超过8000字节,这些值在内部将被存储为一个大类型
对象,而在原始行上维护一个16字节的指针,指向该大型对象值。
五 参考文献
【01】《SQL Server 2012 深入解析与性能优化 第3版》Christian Bolton,Justin Langford,Glenn Berry,Gavin Payne,Amit Banerjee,Rob Farley著
【02】《SQL Server 2008查询性能优化》Grant Fritchey,Sajal Dam著
【03】《Microsoft SQL Server 2008 技术内幕:T-SQL查询》ltzik Ben-Gran,Lubor Kollar,Dejan Sarka,Steve Kass著
六 版权区
感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
博主网址:。
极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2098469527@qq.com。