数据存储元数据
每个分区(不论是用于存储堆还是用于存储索引的)都可以有三种类型的行,每一行存储在自己的页面上,这些类型被称为行内数据页(用于我们的“标准”数据或者索引信息)、行溢出页和LOB数据页。某个特殊分区的一种特殊类型的一组页面称为一个分配单位,因此我们需要介绍最后一种目录视图是sys.allocation_units.sys.allocation_units视图的每个分区包含一行、两行或者三行,因为每个分区上的每个堆或者索引可以有3个分配单位。标准行内数据总有一个分配单位,但是也可能有一个分配单位用于LOB数据,一个分配单位用于行溢出数据。
示例:
CREATE TABLE dbo.employee
(
lname varchar(15) not null,
fname varchar(10) not null,
address varchar(30) not null,
phone char(12) not null,
job_level smallint not null
)
select
object_name(I.object_id) as objectname, I.index_id,I.[type],I.type_desc,p.partition_id,p.partition_number,a.allocation_unit_id,
a.type page_type,a.type_desc Page_Type_desc,a.data_space_id ,A.Total_Pages,A.used_pages,A.data_Pages
from SYS.indexes AS I
INNER JOIN sys.partitions AS P
ON I.object_id=P.object_id AND I.index_id=P.index_id
INNER JOIN sys.allocation_units AS A
ON P.partition_id=A.container_id
WHERE I.object_id=OBJECT_ID('dbo.employee')
运行结果如下:
添加一个varchar(8000)字段,
ALTER TABLE DBO.Employee ADD resume_short varchar(8000)
运行结果如下:
再添加一个text字段:
ALTER TABLE dbo.employee ADD resume_long text
运行结果如下:
再添加一个text字段和varchar(8000)的字段:
ALTER TABLE DBO.Employee ADD resume_short_1 varchar(8000)
ALTER TABLE dbo.employee ADD resume_long_1 text
可以看出,一个表最多有三种数据页,如果继续添加相同的数据类型,那最多只会使的该数据类型对应的数据页的页面增多,当然如果没有存储实际的数据,那数据页是不会变化的。
从上面也可以看出,如果字段类型定义为text类型,那该字段是直接存储在LOB类型的页面。varchar(8000)在实际存储的数据不超过8000的时候存储在标准数据页中,只有超出8000字节了,那就会存储在ROW_OVERFLOW_DATA页面。
那我还有疑问:我们的varchar(max) or nvarchar(max) or varbinary(max)存储在哪种数据页上呢?验证下,先初始化表,然后只添加一个varchar(max)字段:
初始化时我采用了两种方式:
我将后面添加的一些特殊列都删掉:
ALTER TABLE dbo.employee drop column resume_short
ALTER TABLE dbo.employee drop column resume_long
ALTER TABLE dbo.employee drop column resume_short_1
ALTER TABLE dbo.employee drop column resume_long_1
结果发现运行结果没有变化: 得出一个结论,即使删除了这些特殊列,但是一开始分配给该表的数据页类型,即使表中不再存在需要LOB_DATA, ROW_OVERFLOW_DATA页面存储的数据列。
所以我只能采用后者初始化的方法,drop table dbo.employee,然后重建,最后再执行添加一个varchar(max)列,
Alter TABLE dbo.employee ADD experience VARCHAR(MAX)
运行结果如下: varchar(max)字段竟然导致我们表中添加了另外两种数据页类型,这是什么原因呢?
插入一条数据看看:
insert into dbo.employee
select 'zhang','huan','shanxixian','13438995251','1','three years'
运行结果如下:
insert into dbo.employee
select 'zhang','huan','shanxixian','13438995251','1',REPLICATE('three years',700)+REPLICATE('three years',700)
运行结果如下:发现 REPLICATE('three years',700)+REPLICATE('three years',700)这个字符串被截断,长度只有8000.所以还是被存储在标准页。
每个分区(不论是用于存储堆还是用于存储索引的)都可以有三种类型的行,每一行存储在自己的页面上,这些类型被称为行内数据页(用于我们的“标准”数据或者索引信息)、行溢出页和LOB数据页。某个特殊分区的一种特殊类型的一组页面称为一个分配单位,因此我们需要介绍最后一种目录视图是sys.allocation_units.sys.allocation_units视图的每个分区包含一行、两行或者三行,因为每个分区上的每个堆或者索引可以有3个分配单位。标准行内数据总有一个分配单位,但是也可能有一个分配单位用于LOB数据,一个分配单位用于行溢出数据。
示例:
CREATE TABLE dbo.employee
(
lname varchar(15) not null,
fname varchar(10) not null,
address varchar(30) not null,
phone char(12) not null,
job_level smallint not null
)
select
object_name(I.object_id) as objectname, I.index_id,I.[type],I.type_desc,p.partition_id,p.partition_number,a.allocation_unit_id,
a.type page_type,a.type_desc Page_Type_desc,a.data_space_id ,A.Total_Pages,A.used_pages,A.data_Pages
from SYS.indexes AS I
INNER JOIN sys.partitions AS P
ON I.object_id=P.object_id AND I.index_id=P.index_id
INNER JOIN sys.allocation_units AS A
ON P.partition_id=A.container_id
WHERE I.object_id=OBJECT_ID('dbo.employee')
运行结果如下:
添加一个varchar(8000)字段,
ALTER TABLE DBO.Employee ADD resume_short varchar(8000)
运行结果如下:
再添加一个text字段:
ALTER TABLE dbo.employee ADD resume_long text
运行结果如下:
再添加一个text字段和varchar(8000)的字段:
ALTER TABLE DBO.Employee ADD resume_short_1 varchar(8000)
ALTER TABLE dbo.employee ADD resume_long_1 text
可以看出,一个表最多有三种数据页,如果继续添加相同的数据类型,那最多只会使的该数据类型对应的数据页的页面增多,当然如果没有存储实际的数据,那数据页是不会变化的。
从上面也可以看出,如果字段类型定义为text类型,那该字段是直接存储在LOB类型的页面。varchar(8000)在实际存储的数据不超过8000的时候存储在标准数据页中,只有超出8000字节了,那就会存储在ROW_OVERFLOW_DATA页面。
那我还有疑问:我们的varchar(max) or nvarchar(max) or varbinary(max)存储在哪种数据页上呢?验证下,先初始化表,然后只添加一个varchar(max)字段:
初始化时我采用了两种方式:
我将后面添加的一些特殊列都删掉:
ALTER TABLE dbo.employee drop column resume_short
ALTER TABLE dbo.employee drop column resume_long
ALTER TABLE dbo.employee drop column resume_short_1
ALTER TABLE dbo.employee drop column resume_long_1
结果发现运行结果没有变化: 得出一个结论,即使删除了这些特殊列,但是一开始分配给该表的数据页类型,即使表中不再存在需要LOB_DATA, ROW_OVERFLOW_DATA页面存储的数据列。
所以我只能采用后者初始化的方法,drop table dbo.employee,然后重建,最后再执行添加一个varchar(max)列,
Alter TABLE dbo.employee ADD experience VARCHAR(MAX)
运行结果如下: varchar(max)字段竟然导致我们表中添加了另外两种数据页类型,这是什么原因呢?
插入一条数据看看:
insert into dbo.employee
select 'zhang','huan','shanxixian','13438995251','1','three years'
运行结果如下:
insert into dbo.employee
select 'zhang','huan','shanxixian','13438995251','1',REPLICATE('three years',700)+REPLICATE('three years',700)
运行结果如下:发现 REPLICATE('three years',700)+REPLICATE('three years',700)这个字符串被截断,长度只有8000.所以还是被存储在标准页。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27026361/viewspace-774444/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27026361/viewspace-774444/