`
javatgo
  • 浏览: 1195853 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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 )

) 


最小行大小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

 

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

 

 其实就是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

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 是怎么算出来的,呵呵,希望高手来解答!

1
2
分享到:
评论

相关推荐

    SQL Server将一列的多行内容拼接成一行的实现方法

    昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA 企业2 AAA 企业3 ...

    SQLServer中如何将一个字段的多个记录值合在一行显示

    SQLServer 中将一个字段的多个记录值合并到一行显示的实现方法 SQL Server 是一种关系型数据库管理系统,具有强大的数据处理能力和存储能力。在实际应用中,我们经常需要将一个字段的多个记录值合并到一行显示,以...

    Navicat 实现同步sqlserver表结构到mysql操作手册1

    这通常涉及到安装ODBC驱动,如SQL Server Native Client或Microsoft ODBC Driver for SQL Server,并在ODBC Data Source Administrator中创建一个新的系统DSN。确保在配置时勾选“允许保存密码”,否则你可能无法...

    SQLServer数据库表中数据导出成SQL语句工具

    针对这个需求,存在一种名为“SQLServer数据库表中数据导出成SQL语句工具”的实用程序,它能够帮助我们高效地完成这项任务。这个工具通常以MHT(Multi-Part/Related)格式提供,这是一种单一文件Web页面存储格式,...

    40集SQL Server 基础入门视频教程 SQL Server 数据库基础入门必备课程

    10.SQL Server 2014定义表主键、外键.mp4 11.SQL Server 2014新增表记录.mp4 12.SQL Server 2014查询表记录.mp4 13.SQL Server 2014修改表记录.mp4 14.SQL Server 2014删除表记录.mp4 15.SQL Server 2014条件...

    查看SQLServer数据库每个表占用的空间大小.sql

    快捷方便,可查看sqlserver数据库每个表的使用情况,一次下载终身使用,此文件为sql语句格式,免费试用

    sql-server中复制数据库某一个表到另一个数据库中

    在SQL Server环境中,有时我们需要将一个数据库中的某个表复制到另一个数据库中,这可能是为了备份、数据迁移或创建测试环境等目的。根据提供的标题、描述和部分代码内容,我们可以整理出一套较为完整的操作流程和...

    SqlServer连接工具

    首先,SQL Server Management Studio (SSMS) 是微软官方提供的一个全面的集成环境,专为管理和开发SQL Server设计。它包含了对SQL Server实例的各种管理工具,例如对象资源管理器,用于浏览和操作数据库、表、存储...

    C# 开发SQLSERVER数据库自动建表

    标题“C# 开发SQLSERVER数据库自动建表”表明我们将讨论一个使用C#开发的程序,该程序可以自动化创建SQL Server数据库中的表结构。这个功能对于数据导入、系统初始化或简化数据库管理流程非常有用。 描述中提到,该...

    MyBatis通过 JDBC连接 SQL server 数据库 最小例子

    本教程将引导你通过JDBC连接到SQL Server 2005数据库,创建一个最小的例子来展示MyBatis的基本用法。 首先,你需要在项目中添加MyBatis和JDBC驱动的依赖。对于SQL Server 2005,你需要Microsoft的JDBC驱动,如`sql...

    sqlserver自动生成sql语句工具sqlserver转oracle

    首先,标题中的"sqlserver自动生成sql语句工具"指的是可以分析SQL Server数据库结构和数据,自动生成对应的SQL创建语句的软件。这种工具通常能帮助数据库管理员快速获取数据库的定义,便于备份、迁移或在其他环境中...

    sql server2019安装包

    SQL Server 2019是Microsoft推出的一款关系型数据库管理系统,是SQL Server系列中的一个重要版本。它提供了强大的数据存储、处理和分析能力,广泛应用于企业级数据库应用开发和数据分析。在本安装包中,主要包含的是...

    Sqlserver表数据导出成Insert语句的工具

    此工具可以将SQL Server表数据导出成Insert语句。SQL Server的导入导出功能可以导出创建数据库各对象的脚本,却不提供导出目标表的现有数据为Insert语句的功能,此工具可以将SQL Server表数据导出成Insert语句。

    SQL Server Native Client 10.0

    使用Navicat连接SQL Server 2000时,需要配置正确的驱动程序,SQL Server Native Client 10.0就是其中的一个选择,尽管它是为较新版本设计的,但也可以用于连接较老的SQL Server 2000实例。 在连接过程中,以下是...

    SqlServer2005 打开 SqlServer2008 mdf文件

    1. 右击 Sql Server 2005 中的 jmmaj 数据库,选择“任务”->“导入数据”,然后选择数据源和目标数据,复制一个或多个表或视图数据。 2. 在选择源表和源视图的时候,点击下面的“编辑影射”按钮,然后把“启用标识...

    sql server 导入超大SQL脚本文件

    osql 是 SQL Server 提供的一个命令行工具,用于执行 SQL 语句和运行 SQL 脚本文件。osql 工具可以在命令行下执行 SQL 语句,非常适合批量执行 SQL 任务。 如何使用 osql 导入超大 SQL 脚本文件? 在 SQL Server ...

    SQL Server查看所有表大小,所占空间

    用SQL语句查看SQL Server中的数据库查看所有表大小,所占空间

    kepserver读取SQL Server数据库

    通过这种方式,KEPServer充当了一个桥梁,使PLC能够实时访问和操作SQL Server数据库中的数据,这对于实现基于数据库的自动化控制策略至关重要。例如,可以使用PLC读取数据库中的状态信息,根据这些信息执行控制逻辑...

    sqlserver 实现 行转列 split 分割的函数

    sqlserver 实现 行转列 split 分割的函数,具体使用方法写有在文件里。

    sqlserver表数据插入到oracle表中的一种实现方式(表结构相同)

    表结构的创建比较简单,但是表的数据量太大,一时也想不到怎么把sqlserver表数据复制到oracle中,于是请教公司主管,用存储过程实现可以查询出所有数据的insert脚本,在oracle库中创建好表,直接把sqlserver中的...

Global site tag (gtag.js) - Google Analytics