SQLServer中的页如何影响数据库性能

进行数据库管理和开发包括数据库性能分析和优化,须要了解数据库内部的存储结构。不然,不少数据库的优化工做没法展开。SQLServer数据库存储的最基本单位是数据页,系统保存数据和读取数据都是以页为单位来进行操做。数据库

1、数据页的基本组成数据库设计

  SQLServer数据库的一个数据页基本上包括三部份内容:分别为标头、数据行和行偏移量。其中数据行存储的是数据自己,标头与偏移量是一些辅助内容。性能

 数据页的大小。在SQLServer数据库中数据页的大小基本上是固定的,即每一个数据页的大小都为8KB即8192个字节。其中每页开头都有一个标头96个字节,用于存储有关页的信息如页被分配到的页码、页的类型、页的可用空间以及拥有这个页的对象的分配单元ID等等信息,这些内容数据库都会自动管理与更新。数据库开发者只须要知道这个数据页中最多能够用来保存数据的空间大小。每一个页的大小是8192个字节,扣除掉一些必要的开销(如标头信息或者偏移量所占用的空间),通常其能够用来实际存储数据的空间只有8000字节左右。大数据

行的放置顺序。在每一个数据页上,数据行紧接着标头按顺序放置。在页的末尾有一张行偏移表。对于页中的每一行,偏移表都包含一条对应条目。即页的数据有100行则在这个行偏移表中就对应100条偏移量。每一个条目中记录对应行的第一个字节与页首的距离。如第二个条目就记录着第二个数据行的行首字母到数据页页首的位置。因为每一个数据行的大小都是不一样的,所以偏移量也是不均匀的。行偏移表中的条目顺序与页中行的顺序是相反的。这主要是为了更方便数据库定位数据行。

2、大数据类型与行优化

  根据SQLServer数据库定义的规则,行是不可以跨页的。若是一个字段长度很是大超过了8000字节,此时一个页已经不可以容纳这个数据。此时数据库会如何处理呢?在SQLServer数据库中,行不能跨页,因而将行分红两部分分别存储在不一样的行中。因此说,对于大数据类型来讲,是不受到这个页大小(或者说行大小)的限制的。根据上面的分析能够看出,一个数据页其最大能够用的存储空间在8KB。若是扣掉一些必要的开销,其只有8000字节左右。若是某条记录的全部列(包括固定长度的列与可变长度的列其大小超过这个限制,数据库就会将其进行分行处理,分别存储在两个不一样的页中。某表中列的总大小超过限制的8KB,数据库系统会从最大长度的列开始动态的将一个或多个可变长度列移动到另一个页中。简单的说,就是将某个列超过的部分单独存放在另外一个页中。而且同时还会存储一些指针之类的信息,以便在不一样页的记录中创建关联。这种现象在SQLServer数据库中给其取了一个名字,叫作行溢出。设计

3、行溢出对于数据库性能的不利影响。指针

  当全部列(包括固定长度的列与可变长度的列)的累积长度超过一个数据页(或者一个数据行)的最大承受限度时,会将列的内容分行来进行存放。通常来讲,每行的记录超过页的最大容量时,确定会对数据库的性能形成不利的影响。这是毋庸置疑的。由于当超过这个容量时,数据库系统就须要对这个数据行进行分页处理。而分页处理须要数据库额外的开销。如在分页保存时,须要给数据库添加额外的指针;在查询数据的时候,因为分页状况的存在,为了读取一条完整的记录,数据库系统可能不得不读取多页的内容;当进行更新操做,将某个字段的内容变短,致使整行的内容在页的最大范围以内,则相关的记录会被保存在同一个行中。这些操做都须要数据库额外的开销。当在同一个时间处理这些做业多了,那么积累起来,对数据库性能的影响就会很显著。同理,此时若是对相关的记录进行排序、统计等操做,因为涉及到多个页,会延长这些做业的执行时间,即下降数据库的性能。在SQLServre数据库中,含有varchar等变长的数据类型。在SQLServer数据库中对此有最大长度的限制。通常状况下,其最大长度不可以超过不可以超过8000字节的限制。不过他们的总宽度能够超过这个8KB的限制。若是单列的数据长度超过这个限制,那么就不可以使用普通的数据类型。如对于那些用来保存图片或者多媒体的数据,必需要使用大对象数据类型。由于只有这些大对象数据类型不受这个长度的限制。数据库对对于这些大型数据库类型对象有特殊的处理方法。code

4、数据库设计时的注意事项。对象

  在数据库运行时,若是存在比较多的行溢出现象,会在很大程度上影响数据库的性能。因此在数据库设计时,须要考虑到这种状况。通常的数据类型不会形成行溢出的状况。只有一些varchar nvarchar或者CLR用户自定义类型的列,比较容易形成这个行溢出现象。因此在设计数据库时,数据库管理员应该根据用户提供的样板数据分析可能发生行溢出现象的百分比,以及评估会发生溢出现象的频率。若是溢出现象发生的百分比或者频率比较高的话,那么数据库管理员就须要考虑对表格进行规范化处理,以提升数据库的性能,减小溢出现象对于数据库的不利影响。排序

  通常来讲,有两种方法能够显著的下降这个行溢出现象对数据库性能的影响。一是假设列定义了varchar或者用户自定义数据类型等数据类型的时候,若是其长度比较长,颇有可能引发行溢出现象的话,那么就干脆使用大对象数据类型。对于大对象数据类型SQLServer数据库会采起特殊的管理方法,会讲这个数据与普通数据分开来管理。因此能够在很大程度上下降行溢出现象对数据库性能的影响。不过须要注意的是,管理这些大对象数据类型,数据库自己就须要花费更多的精力与资源。因此采用这种方式带来的收益,与行溢出现象带来的损失就会有一个轻重之分的问题。数据库管理员要评估由此带来的收益可以弥补行溢出对象带来的损失。若是能够弥补的话,那么能够采用这个方案。若是不能够的话,那就得不偿失了。故笔者并非很推荐使用这种方法。

  第二种方法执行起来比较简单,具备比较强的可执行性。即若是某个表格中有varchar或则用户自定义的数据类型,并且其最大长度也比较长,很容易形成行溢出现象。此时最好将这些列与表中的其余列分开来存放。即将他们放在两张不一样的表中。而后再经过join语句来进行链接。因为数据页对单个列的最大长度有限制,因此如此处理的话,就不怎么会发生行溢出的现象。此时若是须要查询完整的记录,也须要访问多个页。可是在实际工做中,每每不须要访问所有的信息。如在更新或者统计操做时,不须要更新varchar数据类型的字段,那么数据库的效率就会有很大的提高。即便须要访问完整的记录,须要访问多个页。可是采起join操做也要比行溢出操做性能来的好。如在更新数据时将varchar的列缩短了,此时因为在两个不一样的表中,也不会出现合并行的问题。因此能够在很大程度上节省数据库的开销。显然,这种分表处理的方式更加简单,很容易操做,能够采用这种方式来避免行溢出对SQLServer数据库形成的不利影响。

相关文章
相关标签/搜索