在某些情况下,例如,存储一些特定笔记的时候(读书笔记,心情日志,别人的文章等)。存储在数据库中,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 逻辑读,这是为什么呢?看看两张表的数据页分页,
我们可以看出来,原来,Text类型的字段,具有额外的Log Row类型的数据页,当进行数据查询时,需要额外地再去扫描这些数据页,便有了大数据页逻辑读的额外开销了。