第4周 页面限制8060 bytes

原文:第4周 页面限制8060 bytes

恭喜您!在你面前就只剩下几页了,然后你就可以完成第1个月的SQL Server性能调优培训了。今天我将讲下页的一些限制,还有为什么你会喜欢这些限制,同时也会讨厌这些限制。

正如你在第2周学到的,数据页始终是8kb 的大小,而且你只能在上面存储8060 bytes。你的记录大小指示你在一个页里可以存储多少记录。当你与像CHAR,INT,DATETIME等定长类型数据类型打交道时,你会发现SQL Server有记录长度不能超过8060 bytes长度(包含7 bytes 的内部行开销)的限制。

页面限制——好的一面

当你的表少于8列时,你需要(为每条记录)增加额外7 bytes 的内部行开销。对每增加的8列都要增加额外的1 byte, 例如,17列,你需要9 btyes的内部行开销(7+1+1)。如果你尝试创建更长的记录大小,SQL Server会在你执行CREATE TABLE语句时返回一个错误信息给你。来看看下面的表定义:

1 CREATE TABLE TooLargeTable1
2 (
3    Column1 CHAR(5000),
4    Column2 CHAR(3000),
5    Column3 CHAR(54)
6 )
7 GO

正如你所见,每条记录需要8061 bytes(5000+3000+54+7 bytes)。因此在这种情况下,当你尝试去创建这个表时,SQL Server会返回下列的错误信息。

 

当你创建超过8列的表时,你需要把SQL Server需要的8 bytes的行内部开销也算进去。

1 CREATE TABLE TooLargeTable2
2 (
3    Column1 CHAR(1000) NOT NULL,   Column2 CHAR(1000) NOT NULL,
4    Column3 CHAR(1000) NOT NULL,   Column4 CHAR(1000) NOT NULL,
5    Column5 CHAR(1000) NOT NULL,   Column6 CHAR(1000) NOT NULL,
6    Column7 CHAR(1000) NOT NULL,   Column8 CHAR(1000) NOT NULL,
7    Column9 CHAR(53) NOT NULL
8 )
9 GO

因此这里又是一个非法的表定义(8000+53+8 bytes),这里SQL Server会返回一个错误信息。

页面限制——坏的一面

在上一环节我已经向你展示了页面限制你喜欢的一面,因为当你在创建这样表的时候,SQL Server会返回你一个错误信息。但是页面限制也有你讨厌的一面,因为SQL Server会允许你创建这样的表,而且有时INSERT语句执行成功,有时却会失败……我们来看下。

这里我们面对的问题是与像VARCHAR等变长数据类型。当这些列不能存在它本身页时,SQL Server会把它们移动到在另外页面的行偏移位置。这个被称为 行溢出页(Row-Overflow page)。SQL Server会在原来的页面留下24 bytes长的指向行溢出页的指针。

在于其他列组合时的某些情况下,这个指针会溢出8060 bytes的限制。我们来看下下面的表定义:

1 CREATE TABLE TooLargeTable3
2 (
3    Column1 CHAR(5000),
4    Column2 CHAR(3000),
5    Column3 CHAR(30),
6    Column4 VARCHAR(3000)
7 )
8 GO

如你所见,这里我使用了VARCHAR(3000)的数据类型。你会看到SQL Server这里会给你一个警告信息。这个警告提示你可以创建这个表,但在执行INSERT/UPDATE语句时可能会失败……

 

下面在表里的插入语句会成功:

1 INSERT INTO TooLargeTable3 VALUES
2 (
3    REPLICATE('x', 5000),
4    REPLICATE('x', 3000),
5    REPLICATE('x', 30),
6    REPLICATE('x', 19)
7 )
8 GO

这里的记录大小是8056 bytes长(5000+3000+30+19+7 bytes)。在这个情况下,SQL Server会把第4列的数据保存在主数据页。但是想像下下面的INSERT语句:

1 INSERT INTO TooLargeTable3 VALUES
2 (
3    REPLICATE('x', 5000),
4    REPLICATE('x', 3000),
5    REPLICATE('x', 30),
6    REPLICATE('x', 3000)
7 )
8 GO 

在刚才的INSERT语句,SQL Server会把第4列数据移到行溢出页(row-overflow page),因为这3000 bytes 不能在主数据页里放下。这也就意味着SQL Server会在这里留下一个指向不同页且24bytes 长的指针,在那个位置可以找到数据。但是我们的记录大小现在是8061 bytes长(5000+3000+30+24+7 bytes)。

Duang,你的记录长度超过8060 bytes,INSERT语句执行失败了!

 

这些就是坏的限制,因为他们在数据库操作的时候隐藏着,好的一面就是在你定义表架构的时候如上所示可见的。想想看是啥?

小结

在你设计你的表结构时,你要非常仔细的想下你的操作。在SQL Server里与页打交道时你会碰到很多这样的执行进去后才出现的限制。当然,在SQL Server给你错误信息时,你不允许创建这个表,基本上就天下太平了。

当当你收到警告时,基本上每个人会想不都不想下就忽略掉。这始终是个坏的操作,因为你已经看到了,你的INSERT可能在运行时失败,问题的发生你是可以预见的。我希望你现在已经明白这个性能调优培训是个很好内幕公开,并且为什么理解数据页的内部结构是多么重要!

在接下来的培训我会讲解SQL Server中堆表的更多细节,还有为什么它们有时是好的(设计),有时候却是不好的(设计)。请继续关注,并且好好享受剩下的7天!

时间: 2024-09-23 14:20:41

第4周 页面限制8060 bytes的相关文章

SQL Server 性能调优培训引言

原文:SQL Server 性能调优培训引言      大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录.       作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于是我通过网络找了各种MS SQL技术的相关文档,总觉得讲得比较干涩,没有一个系统性,今年3月底我无意浏览到一个网站提供免费的性能调优的半年培训(http://www.sqlpassion.at/academy/performance

Oracle 和 MIcrosoft SQL 的不同

oracle 还是有很多的不同,转贴如下:http://www.bristle.com/Tips/SQL.htm#Oracle%20Tips  Table of Contents:Oracle Tips SQL Tips SELECT * and more Materialized View PL/SQL Tips SQL Navigator Tips See Also MS SQL Server Tips SQL Tips Dynamic SQL in a Stored Procedure S

python下使用protobuf

python解决ImportError: No module named google.protobuf 关于protocol buffer的优点,就过多涉及:如果涉及到数据传输和解析,使用pb会比自己去写解析代码更有效率,至少对于大部分而言是这样的. 一.下载,安装 到code.google.com下载源码,解压: ./configure && make && make check && make install 最后一步涉及到权限,可能会需要sudo.二

SQL Server 2014 数据内存优化表详解

不同于disk-based table,内存优化表驻留在内存中,使用 Hekaton 内存数据库引擎实现.在查询时,从内存中读取数据行:在更新时,将数据的更新直接写入到内存中.内存优化表能够在disk上维护一个副本,用于持久化数据集. Memory-optimized tables reside in memory. Rows in the table are read from and written to memory. The entire table resides in memory.

SQL SERVER 表最小行的一个纠结问题

昨天一个同事突然问我,说他在SQL 2000数据库创建如下表的时候,突然碰到了下面一条警告信息.SQL脚本和警告信息如下:  IF OBJECT_ID(N'Log') IS  NULL BEGIN CREATE TABLE Log ( [Date] DATETIME, [Thread] NVARCHAR(255), [Level] NVARCHAR(50), [Logger] NVARCHAR(255), [Message] NVARCHAR(4000), [Exception] NVARCHA

菜鸟新站推广心得

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 看到这个标题,请不要误会,我不是来谈经验的,毕竟做站还不到一个月,只是谈谈自己的看法和心得罢了. 做站大概有二十几天了,做的是地方性社区,姆大陆-大连社区目前除了百度迟迟不肯收录外,其他的搜索均已经收录了本站,而且页面数量也不算少.现在谈谈收录的心得. 最早收录的是google,只是在登陆入口提交了一次,就被收录了,只不过刚开始收录的时候总是

ASP.NET MVC重点教程一周年版 第一回 安装,并使ASP.NET MVC页面运行起来

从前写过一系列的ASP.NET MVC教程,ASP.NET MVC在这之后历经5个preview版本终于到今天的 RC版本,而且不久就要正式推出正式版本,所以值此之际,重典也重新修正这一系列的教程,使之 与时俱进. 因为最初的一篇是写自2008年3月10日(Asp.net Mvc Framework 系列),回头 看看已经足足一年了,所以本系列修正版本的教程就叫做ASP.NET MVC重典教程一周年版. 现在重开正文: 一.前ASP.NET MVC时代的故事 ASP.NET MVC是微软推出的基

开发者论坛一周精粹(第八期):WP 使用 FastCGI Cache 实现高效页面缓存

第八期(2017年5月8日-2017年5月14日 ) 页面缓存(Page Cache)是 WordPress 性能优化比较重要的一环,目前 WP 有很多页面缓存插件:W3 Total Cache.WP Super Cache.Comet Cache 等,不过它们都是 务器软件 -- PHP -- WP缓存插件 -- 本地或对象缓存,差不多要经过四个阶段,在高并发下效率是很低的. 使用 FastCGI Cache 实现高效页面缓存 作者:ivmmff [企业IT管理员必读]WanaCrypt0r

如何用单页面在一周内打造一万IP

中介交易 SEO诊断 淘宝客 云主机 技术大厅 用单页面在一周内带来一万IP,似乎是顶级SEOER的杰作,一直没有人透露其中的技巧,都在暗暗地赚钱了.其实做SEOER也不需要这么狭隘,关键词的资源,不是某一个SEOER能做得完的.今天把其中的技巧完全分享出来,希望有心得朋友,能达到用单页面或者若干页面,一周内做到上万IP的目标. 首先是关键词的选取,这是最关键的地方,也是关乎成败的技巧,选择关键词的标准,一是看搜索量,百度指数和相关搜索,需要耐心寻找合适的目标关键词.一般来说搜索量在3000-5