表的内部存储

数据存储元数据

每个分区(不论是用于存储堆还是用于存储索引的)都可以有三种类型的行,每一行存储在自己的页面上,这些类型被称为行内数据页(用于我们的“标准”数据或者索引信息)、行溢出页和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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值