从物理结构说sql server 优化

  SQL Server 中数据存储的基本单位是页。为数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 读取或写入所有数据页。

  平时在通过Sql Server Profiler 或者打开Statistics IO 选项时看到物理读,逻辑度的单位都是页。

    在 SQL Server 中,页的大小为 8 KB。这意味着 SQL Server 数据库中每 MB 有 128 页。每页的开头是 96 字节的标头,用于存储有关页的系统信息。此信息包括页码、页类型、页的可用空间以及拥有该页的对象的分配单元 ID

 

下表说明了 SQL Server 数据库的数据文件中所使用的页类型。

页类型 内容

Data

text in row 设置为 ON 时,包含除 text ntextimagenvarchar(max)varchar(max)varbinary(max)xml 数据之外的所有数据的数据行。

Index

索引条目。

Text/Image

大型对象数据类型:

  • text ntextimagenvarchar(max)varchar(max)varbinary(max)xml 数据。

数据行超过 8 KB 时为可变长度数据类型列:

  • varcharnvarcharvarbinarysql_variant

Global Allocation Map、Shared Global Allocation Map

有关区是否分配的信息。

Page Free Space

有关页分配和页的可用空间的信息。

Index Allocation Map

有关每个分配单元中表或索引所使用的区的信息。

Bulk Changed Map

有关每个分配单元中自最后一条 BACKUP LOG 语句之后的大容量操作所修改的区的信息。

Differential Changed Map

有关每个分配单元中自最后一条 BACKUP DATABASE 语句之后更改的区的信息。

在数据页上,数据行紧接着标头按顺序放置。页的末尾是行偏移表,对于页中的每一行,每个行偏移表都包含一个条目。每个条目记录对应行的第一个字节与页首的距离。行偏移表中的条目的顺序与页中行的顺序相反。

大型行支持

行不能跨页,但是行的部分可以移出行所在的页,因此行实际可能非常大。页的单个行中的最大数据量和开销是 8,060 字节 (8 KB)。但是,这不包括用 Text/Image 页类型存储的数据。包含 varcharnvarcharvarbinarysql_variant 列的表不受此限制的约束。当表中的所有固定列和可变列的行的总大小超过限制的 8,060 字节时,SQL Server 将从最大长度的列开始动态将一个或多个可变长度列移动到 ROW_OVERFLOW_DATA 分配单元中的页。每当插入或更新操作将行的总大小增大到超过限制的 8,060 字节时,将会执行此操作。将列移动到 ROW_OVERFLOW_DATA 分配单元中的页后,将在 IN_ROW_DATA 分配单元中的原始页上维护 24 字节的指针。如果后续操作减小了行的大小,SQL Server 会动态将列移回到原始数据页。

     数据行存储在页上,超出页大小如此。

这样就很简单的出来了2个原则:

表设计:Row 要占用尽可能短的长度,占用少的空间,让一个page上存储更多的row,这样在相同的读次数下,获取到的数据就更多了。

查询: Select的时候,别动不动就来个*,因为当row 中有Image,text等,或者本身变长字段vchar等加起来的长度超过了8k,就会需要去

ROW_OVERFLOW_DATA 中去读取一次。增加了读的开销。当然从网络等开销来说也不建议用 * 。

 

 

 

 

posted @ 2011-08-24 17:06  go on coding  阅读(677)  评论(4编辑  收藏  举报
悠季瑜伽会馆