一定需要使用(N)Text吗?

 

在某些情况下,例如,存储一些特定笔记的时候(读书笔记,心情日志,别人的文章等)。存储在数据库中,VARCHAR(8000)的长度不够用。一般的情况下,往往会想到,直接使用N/Text类型的字段。这时,问题来了:

假设通常情况下,绝大部分操作是保存一些简单的内容(<1500),长度通过2000已经极为稀少了(<1/10),只有极个别(1/100)会超过8000。此时若所有的数据均使用N/Text来进行记录。在进行数据读取操作的时候,数据库还需要额外地再去读取Lob-Row的数据行,在大数据量搜索的情况下,对性能造成极大的影响。并且N/Text类型的数据无法使用绝大多数字符串的内置函数,这为日常的应用也带来了极大的不方便。

为了解决这个问题从SQL2005开始,引入了VARCHAR(Max)类型的数据。

这两个类型的数据,有什么差异呢?做个实验:

create table VarcharMaxTestTable
(
	TestValue varchar(max)
)
go
insert into VarcharMaxTestTable values(REPLICATE('f', 1000));

--insert into VarcharMaxTestTable values(REPLICATE('f', 100));

create table TextTestTable
(
	TestValue text
)
go
insert into TextTestTable values(REPLICATE('d', 1000));


首先创建两张表,并进行数据初始化。而后,进行一次查询统计:

set statistics io on
select * from VarcharMaxTestTable

select * from TextTestTable
set statistics io off

 

Table 'VarcharMaxTestTable'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

Table 'TextTestTable'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 3, lob physical reads 0, lob read-ahead reads 0.

 

在进行Text类型的字段的查询,增加了lob 逻辑读,这是为什么呢?看看两张表的数据页分页,

image

image

我们可以看出来,原来,Text类型的字段,具有额外的Log Row类型的数据页,当进行数据查询时,需要额外地再去扫描这些数据页,便有了大数据页逻辑读的额外开销了。

posted @ 2010-08-10 15:42  老玉米  阅读(483)  评论(4编辑  收藏  举报