当前位置: 首页 > news >正文

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]    NVARCHAR(4000)
    
)
END
ELSE
  PRINT('该表已经存在,请检查数据库');
GO


Warning: The table 'Log' has been created but its maximum row size (17159) exceeds the maximum number of bytes per row (8060). INSERT or UPDATE of a row in this table will fail if the resulting row length exceeds 8060 bytes.

我以前也没有遇见过这样的警告信息,当时我在SQL SERVER 2000 下面执行这段脚本,果然有这个警告信息,还有就是为什么Maximun ROW SIZE 17159?;当我在SQL SERVER 2005 下面执行这段脚本却没有警告信息出现,难道SQL SERVER 2005 与SQL SERVER 2000在存贮机制上面有什么不同?在搞清楚这些问题前,我们先来看看其它的一些相关问题,就是SQL SERVER 2000/2005中最大数据行都是8060字节(对定长数据而言), 其中SQL SERVER 2000中可以使用的大小为8039字节, 而SQL SERVER 2005可以使用的大小为8053字节。我们可以从下面的脚本中实验一下(SQL SERVER 2005)

CREATE TABLE TEST
(
    FIELD1 CHAR(4000),
    FIELD2 CHAR(4000),
    FIELD3 CHAR(53)
)

CREATE TABLE TEST1
(
    FIELD1 CHAR(4000),
    FIELD2 CHAR(4000),
    FIELD3 CHAR(54)

)

2011-5-18-01.gif

最小行大小8061 = 4000 + 4000 + 54 + 7(内部开销)。下面我们改变下上面脚本的数据类型,如下所示,看看在SQL SERVER 2005下的情况

IF OBJECT_ID(N'Log') IS  NULL
BEGIN
CREATE TABLE Log
(
    [Date]             DATETIME,
    [Thread]           CHAR(255),
    [Level]            CHAR(50),
    [Logger]           CHAR(255),
    [Message]          CHAR(4000),
    [Exception]        CHAR(4000)
    
)
END
ELSE
  PRINT('该表已经存在,请检查数据库');

GO

 2011-5-18-03.gif

那么最小行8575是怎么算出来的呢,我们先看这张经典数据行结构图(引自Inside SQL SERVER)

2011-5-18-02.gif 

 其实就是8 + 255 + 50 + 255 + 4000 + 4000 = 8568   + 7 = 8575  其中的7个字节是这样来的

Status Bits A                     1

Status Bits B                       1

Length of fixed-length ........               2 

number of columns 2 

Null bitmap 1 bit for each column         (6/8)1

由于表里面没有变长字段,所以其它与变长相关的字节为0 所以为7。 那么接下来我们看看开篇的问题为什么 maximum row size (17159)

8 + 255* 2 + 50 * 2 + 255 * 2 + 4000 * 2 + 4000 *2   = 17128

1 + 1 + 2 + 2 + 1 + 2 + 2* 5  = 19 

那么17128 + 19 =  17147 但是结果是17159,有点不明,查了很多资料也没搞清楚,这个17159 是怎么算出来的,呵呵,希望高手来解答!

呵呵,感谢邀月老大的解答:本来我怎么也找不出的12个字节即是: Heap中非聚集索引的叶级页有一个索引键列值(本例中由系统自动添加),加上一实际数据行的RID,即4+8=12



SELECT t.name AS [Table Name], i.name AS [Index Name], i.minlen as minlen

FROM sysobjects AS t JOIN sysindexes AS i ON t.id = i.id

WHERE t.id > 100  AND t.id=object_id( 'log')

相关文章:

  • 利用Android Lost通过互联网或短信远程控制安卓设备
  • http://blog.csdn.net/huang_xw/article/details/7090173
  • Outlook 2013 在邮件里面点击超链接时弹出“组织策略阻止我们为您完成此操作”...
  • Wordpress简单配置
  • [android] 看博客学习hashCode()和equals()
  • Linux MySQL源码安装缺少ncurses-devel包
  • 图解 MongoDB 地理位置索引的实现原理(转)
  • 【转】越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用
  • 软件测试流程进阶----两年软件测试总结
  • 使用sublime同步编辑线上脚本
  • Windows 7 64bit和Visual Studio 2010下安装及使用GnuWin32
  • iptables/netfilter防火墙
  • 对Spring 的面向切面的理解
  • 通过案例对SparkStreaming 透彻理解三板斧之一:解密SparkStreaming运行机制
  • 文件夹工具类 - FolderUtils
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【附node操作实例】redis简明入门系列—字符串类型
  • CentOS7 安装JDK
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • JavaScript实现分页效果
  • js中forEach回调同异步问题
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • underscore源码剖析之整体架构
  • v-if和v-for连用出现的问题
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 二维平面内的碰撞检测【一】
  • 基于axios的vue插件,让http请求更简单
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • Java总结 - String - 这篇请使劲喷我
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #每天一道面试题# 什么是MySQL的回表查询
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (论文阅读40-45)图像描述1
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)python发送HTTP 请求的两种方式(get和post )
  • .Net Core 中间件验签
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net操作Excel出错解决
  • .NET开发者必备的11款免费工具
  • .NET框架
  • .NET命令行(CLI)常用命令
  • .net中调用windows performance记录性能信息
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [2016.7.Test1] T1 三进制异或
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [HEOI2013]ALO
  • [HNOI2018]排列
  • [INSTALL_FAILED_TEST_ONLY],Android开发出现应用未安装
  • [macOS] Mojave10.14 夜神安卓模拟器启动问题
  • [MRCTF2020]Ez_bypass1
  • [office] 在Excel2010中设定某些单元格数据不参与排序的方法介绍 #其他#知识分享#笔记
  • [python] dict类型变量写在文件中