4.2 SQL Server数据库物理结构
2018-07-07 11:26 笑一笑十年少!!! 阅读(2329) 评论(0) 编辑 收藏 举报4.2 SQL Server数据库物理结构
SQL Server将所有数据都存储在文件中。这些文件被分成子结构,SQL Server管理这 些子结构来维护其中所包含数据的完整性、结构和逻辑组织。虽然本书只是提供有关SQL
Server 2008数据库管理的入门级指导,但是对于新的数据库管理员而言,了解像数据库的 物理体系结构这样的髙级主题还是很重要的。了解SQL Server如何存储和维护数据有助于 更好地理解数据变更如何影响性能,以及更有效地诊断数据库问题。
4 .2 .1 物理存储数据类型
在学习数据的物理存储之前,了解SQL Server存储的数据类型非常重要。SQL Server 2008联机丛书把数据类型分为以下7 个类别:
• 精确数字
• 近似数字
• 日期和时间
• 字符串
• Unicode字符串
• 二进制字符串
• 其他数据类型
虽然从可用性的角度来看数据类型时,这样的分组很有意义,但与本节讨论内容相关
的是数据是如何存储的。SQL Server数据类型基本上可分为3 种存储类型:定长数据类型、 变长数据类型和大型对象数据类型。在某些情况下,大型对象数据类型也可作为变长类型,
后面会予以解释。本节中描述的数据类型仅可以为关联数据的物理存储指派表列数据类型。
这并不包括本章后面将讲述的cursor和 table数据类型
1 .定长数据类型
定长数据类型的大小是固定的。用来存储这些数据的内存或磁盘空间的大小不会变
化。下面列出了定长数据类型:
• bit—— bit是一个整型数据类型,支持的值是0 或 1。与其名称的意义相反,对于8 位或更少的数据,bit数据类型实际上占用一个字节的空间。 • tinyint—— tinyint数据类型 使 用 1 字节的存储空间来存储0〜255之间的无符号整 数值。
• smallint-----smallint数据类型使用2 个字节的存储空间来存储一个有符号的整数,
其取值范围为- 32 768〜32 767。
• int—— int数据类型使用4 个字节的存储空间来存储一个有符号的整数,其取值范
围 为 - 2 147 483 648〜 2 147 483 647。
• bigint—— bigint数据类型使用8 个字节的存储空间来存储一个有符号的整数,其取
值范围为- 9 223 372 036 854 775 808—9 223 372 036 854 775 807。
• decimal和 numeric------decimal和 numeric数据类型的功能是一样的。一般应该采用
decimal数据类型,因为它对存储的数据的描述性更好。基于使用方式,可以将decimal 数据类型设定为使用不同的固定存储空间。
当使用decimal数据类型时,也可以指定 要存储的数据的精度(P)和小数位数(s)。表示方式为deCimal(p,S)。精度和小数位数用 介于0〜38之间的正整数值指定。不过,小数位数值必须小于或等于精度值,而且
只能在指定了精度值的情况下才能指定。存储空间取决于精度值,如表4-1所示。
smallmoney-----smallmoney 数据类型存储介于- 214 748.3648〜214 748.3647 之间
的货币值。smallmoney数据类型精确到所存储货币单位的万分之一,占用4 个字
节空间。
• money------money 数据类型存储介于- 922 337 203 685 477.5808〜922 337 203 685
477.5807之间的货币值。它精确到所存储货币单位的万分之一,占用8 个字节空间。
• real—— real数据类型是浮点型数字,所以它的值是近似的。real支持的值是介于
- 3.40E+38〜 - 1.18E — 38之间的负数、0 以及介于1.18E—38〜3.40E+38之间的
正数。它占用4 个字节的空间。
• float—— float数据类型是浮点型数字,因此其值也是近似值。float支持的值范围 和所需的存储空间取决于float的精度。精度表示为float (n),其中n 是用来存储科 学记数法中尾数的位数。精度值允许介于1〜53之间。1〜24的精度值需要4 个字
节的存储空间,25〜53的精度值需要8 个字节的存储空间。对于默认的精度53来
说,float支持的值范围是一1.79E+308-----2.23E—308的负数、0 以及2.23E—308〜 1.79E+308之间的正数。
• smalldatetime------smalldatetime数据类型用于存储1900年 1 月 1 日到2079年 6 月
6 日之间的日期。它可以精确到分钟,占用4 字节的空间。SQL Server在内部将 smalldatetime数据存储为一对2 字节的整数。第一个2 字节整数用来存储1900年 1月 1 日以来的日期,另一个2 字节整数是用来存储零点之后的分钟数。
• datetime-----datetime数据类型用于存储1753年 1 月 1 日到9999年 12月 3 1 日之
间的日期和时间。它可以精确到3.33毫秒,占用8 字节的存储空间。SQL Server 在内部将datetime数据存储为一对4 字节的整数。第一个4 字节整数用来存储1753 年 1 月 1 日以来的天数,第二个4 字节整数用来存储零点之后的毫秒数(舍入到
3.33)O
• datetime2------datetime2数据类 型 是 datetime数据类型的扩展,支持更宽范围的日
期和更髙的精度。它可用于存储介于0001年 1 月 1 日至9999年 12月 31之间的
日期和时间,精确到100毫微秒。与 decimal和 numeric数据类型类似的是,它使 用可选精度声明。秒小数部分的默认精度为7 位,即 100毫微秒。精度等于或小
于 3 时,存储空间为6 个字节:精度为4 和 5 时为7 个字节;精度为6 和 7 时为8
个字节。
• datetimeoffset------datetimeoffset数据类型用于存储介于0001年 1 月 1 日至9999年
12月 31之间的日期和时间,且相对于UTC(协调世界时)的时区偏移量范围为负14
小时到正14小时。和 datetime2数据类型一样,它精确到100毫微秒,使用可选的 精度声明。
• date—— date数据类型用于存储介于0001年 1 月 1 日至9999年 12月 31之间的日
期值、它精确到天,占用3 字节的存储空间。SQL Server在内部将date数据存储 为 3 字节的整数,用于存储自0001年 1月 1 日以来的天数。
• time—— time数据类型用于存储00:00:00.0000000至 23:59:59.9999999之间的时间
值。它精确到100毫微秒。与 decimal和 numeric数据类型类似,它使用可选精度 声明。秒小数部分的默认精度为7 位,即 100毫微秒。精度小于3 时,存储大小
为 3 个字节;精度为3 和 4 时为4 个字节;精度为5、6 和 7 时为5 个字节。
• char------char数据类型用来存储1〜8000字符之间的定长非Unicode数据,表达式
为 charOi),其中n 是要存储的字符数。每-个字符都需要1字节的存储空间。
• nchar------nchar数据类 型 用 来 存 储 1〜 4000字符之间的 定 长 Unicode数 据 ,
表达式 为
C
har(n),其 中 n 是要存储的字符数。每一个字符都 需 要 2 字节的存储空间。如 果必须支持多种语言,则 Unicode类型比较合适。 • binary------binary数据类 型 用 来 存 储 1〜 8000字节之间的定量的二进制数据,表达 式 为 binary (n ),其 中 n 是要存储的二进制字节数。
• rowversion 或 timestamp------rowversion 和 timestamp 数 据类型是同义词,占用 8 字
节的存储空间。任何情况下都要尽可能地指定rowversion而 不 是 timestamp,因为 rowversion更加准确地反映了数据类型的本质。timestamp数据类型跟时间完全无 关 。它实际上就是 一 个 8 字节的二进制字符串,用来定义表行的版本值。当
rowversion或 timestamp被指定为某表列的数据类型时,每一个对该表执行的插入 和更新操作都会 导 致 SQL Server生成一个新值,并放在合适的字段中。
• uniqueidentifier----- uniqueidentifier数据类型被存储为一个 16字节的二进制字符串, 用 32个 16进制字符表 示 。SQL Server可 以使用NEWID()函 数生成uniqueidentifier, 或 插 入 现 有 的 uniqueidentifier并 存 储 在 uniqueidentifier列 中 。
2 .变长数据类型和大型对象数据类型
当数据需要的具体空间数量无法预测时(例如保存一个人的姓的列),就需要使用变长
数据类型。varchar、nvarchar和 varbinary数据类型都属于变长数据类型。
然而,当为字符串或二进制字符串的长度指定(MAX)选项时,就可以把这些可变数据
类型看作大型对象数据类型。其主要区别是数据的存储方式。大型对象数据默认存储在数
据行外部的单独物理结构中,而变长数据存储在数据行中。
下面介绍了这些数据类型:
• varchar------varchar数据类 型 用 来 存 储 1〜 8000字 符 之 间 的 变 长 非 Unicode数 据 , 表达式是varcharOi),其 中 n 是存储的最大字符数。每个字符都要求1 字节的存储 空间。varchai•使用的实际存储空间是n 值 加 上 2 字节。varchar数据类型还支持可
选的(MAX)长度指定。在 使 用 varchar (MAX)时,支持的最大字符量是2 147 483 647, 需要多达2GB的存储空间。指定了(MAX)选项之后,SQL Server会 把 varchar数据
存储在数据行中,除非数据鼋超过了 8000字节,或者这么做会超过8060字节的
最大行大小。在这些情况下,SQL Server会 把 varchar数据移出行,存储到一个单 独的大型对象存储空间中(参见本章后面的“数据页” 一节)。
• nvarchar------nvarchar数据 类 型 和 varchar数 据 类 型 是 一 样 的 ,只 是 它 用 来 存 储 Unicode数据。每 个 Unicode字符都需要2 字节的存储空间,这样其支持的最大字
符 数 就 是 1 073 741 824。
• varbinary------varbinary数 据 类 型 也 和 varchar数据类型类似,只是它用来存储二进
制数据而不是字符数据。除此之外,(MAX)选项的存储和使用与上面介绍的一样。
• text-----text数据类型是一个大型对象数据类型,和 varchar(MAX)数据类型很相似,
因为它也可以用来存储多达2GB的字符数据。主要的区别在于text数据默认存储 于数据行外部,而 且 text数据类型不能 作 为 SQL Server函数、存储过程或触发器 的参数传递。
• ntext—— ntext数据类型和text数据类型是一样的,只是它用来存储Unicode数据。 2GB的 Unicode字符数据只支持1 073 741 824个字符。 • image------image数据类型是一个大型对象数据类型,和 varbinary(MAX)数据类型
很相似。它也可以用来存储多达2GB的二进制数据,但总是存储在数据行外部的
单独的大型对象数据页中。
• XML—— XML数据类型是一个大型对象数据类型,用来以本地格式存储XML。
每个数据行中可以存储多达2GB的XML数据。
• sql variant----- 当不知道值的实际数据类型时,可以在对象中使用sql_variant数据 类型。sql_variant数据类型可以用来存储任何 少 于 8000字节的值。和 sql_variant 类型不兼容的数据类型有text、ntext. image、timestamp、cursor、varchar (MAX) 和 nvarchar (MAX)。
3. CLR数据类型
SQL Server 2008包含3 个不同的基于CLR的数据类型。首先是hierarchyid,它用于管
理表结构中的分层数据。另外两个是新的空间数据类型,用于表示几何对象(比如国界、道
路和湖泊等)的物理位置和形状信息。SQL Server 2008的空间数据类型遵循开放式地理空
间联盟(OGC,Open Geospatial Consortium)的 Simple Features for SQL 的 1.1.0 版标准。 • hierarchyid------hierarchyid数据类型用于创建带有分层结构的表或是引用另一位置
的数据的层次结构。所需的存储空间取决于记录数和行中的层次结构数。要为一
个有着100 000名雇员(被划分为7 个级别)的组织存储层次号,需要5 个字节。行
越多并且划分的层次结构越多,所需的存储空间越多。该数据类型被限制为892
个字节。
• geometry—— 这个类型表示欧几里得(平面)坐标系中的数据。
• geography-----geography(地理空间)数据类型存储楠球体(圆球)数据,例 如 GPS讳
度和经度坐标。
4. 行内数据
通过使用large value types out of row表选项,数据库管理员可以指定将所有的varchar (MAX)、nvarchar (MAX)和 varbinary (MAX)数据都视为大型对象数据,并存储在行外部的
单独的大型对象数据页上。可以将该选项设为ON或者O FF,如下所示:
sp_tableoption * tablename', 'large value types out of row1, *0N1 sp_tableoption 1tablename1, 'large value types out of row', 'OFF'
同样,如果数据库管理员想要在行中保存text或 ntext数据,直到它们超过了一个指 定的大小,那么可以指定表选项“text in row”。该选项允许数据库管理员指定在行中保存 的数据的范围。所支持的数据范围是24〜7000字节。通过ON选项值,可设置默认值256
字节。要关闭此选项,则使用OFF:
sp_ tableoption * t a b l e n ^ m e ', 1 text in row'. * n u m b e r o f b y t e s 1
sp_ tableoption * ta b le n a m e * , 'text in row*, •ON,
sp_ tableoption ' ta b le n a m e 1 , * text in row*, •OFF*
4.2.2 FILESTREAM 数据
SQL Server 2008的一个增强功能是在数据库外部存储非结构化数据,如文本文档、图 像和视频,但又链接至在其中定义列的行。通过将varbinary(MAX)二进制大型对象(BLOB)
数据存储为文件系统上的文件,而不是存储在数据库数据文件中单独的大型对象数据页上,
FILESTREAM集成了数据库引擎与NT文件系统。Transact-SQL语句可插入、更新、査询
和备份FILESTREAM数据。
为了使用FILESTREAM,数据库需要一个指派为FILESTREAM存储区域的文件组。
下列示例演示了如何向AdventureWorks2008数据库添加FILESTREAM文件组••
USE Master GO
ALTER DATABASE AdventureWorks2008 ADD FILEGROUP MyFilestreamGroup2 CONTAINS FILESTREAM
GO
ALTER DATABASE AdventureWorks2008 ADD FILE (NAME = N 'FileStreamData'
r
FILENAME = N ,D:\SQLData\FileStreamData,) TO FILEGROUP MyFilestreamGroup
GO
在向数据库添加了新文件组后,可以添加或修改表,以将表的二进制大型对象数据作
为数据库引擎管理的对象存储到文件系统中。下列示例演示了如何创建使用FILESTREAM
存储的表:
USE AdventureWorks2008
GO
CREATE TABLE MyLargeData (DocumentIdentifier uniqueidentifier ROWGUIDCOL NOT NULL UNIQUE ,DocumentFile VARBINARY(MAX) FILESTREAM NULL)
GO
记住,启用FILESTREAM存储的表必须有一个非NULL的唯一 ROWGUID列。要向
已有列添加FILESTREAM列,必须确保表有一个ROWGU1D列,否则必须添加一个。
4 .2 .3 其他数据类型
如前所述,SQL Server 2008中有两种数据类型是表或索引定义的一部分,并不用于在 磁盘上物理存储数据。这两种数据类型用于在编程对象中操作数据。
• table一 table数据类型用于将一组数据行存储在内存中。它主要与表值函数一起 使用,但也可用于任何编程对象来返回一个有组织的结果集—— 这个结果集拥有
实际表的大部分属性。可以用一组列、一个指定的主键、CHECK约束和一个默认
约束来声明和实例化一个table变量。
• cursor------Transact-SQL可以很好地执行数据集操作 ,但有时必须一次一行地操作
数据。cursor数据类型可以满足此类要求。一个游标保存一组来自某个查询的完整 数据行,可对游标进行操作,使其一次返回一行。要想了解有关游标及其用途的
完整讨论,可 以 参 阅 Paul Turley和 Dan Wood编 写 的 《T-SQL编程入门经典(涵盖
SQL Server 2008 & 2005)》一 书 。