在SQL Server上使用varchar(MAX)与TEXT

我刚刚读到VARCHAR(MAX)数据types(它可以存储接近2GB的char数据)是SQL Server 2005和下一个SQL SERVER版本中TEXT数据types的推荐替代品。

如果我想在一列中search任何string,哪个操作更快?

  1. VARCHAR(MAX)列使用LIKE子句?

    WHERE COL1 LIKE '%search string%'

  2. 使用TEXT列并在此列上放置一个全文索引 / 目录 ,然后使用CONTAINS子句进行search?

    WHERE CONTAINS (Col1, 'MyToken')

VARCHAR(MAX)types是TEXT的替代品。 基本的区别在于TEXTtypes将始终将数据存储在Blob中,而VARCHAR(MAX)types将尝试将数据直接存储在行中,除非它超过了8k的限制,并且此时将其存储在blob中。

在两个数据types之间使用LIKE语句是相同的。 VARCHAR(MAX)提供的附加function是它也可以与=GROUP BY一起使用,就像任何其他的VARCHAR列一样。 但是,如果确实有大量数据,则使用这些方法将会产生巨大的性能问题。

关于如果你应该使用LIKEsearch,或者如果你应该使用全文索引CONTAINS 。 无论VARCHAR(MAX)还是TEXT这个问题都是一样的。

如果你正在search大量的文字和性能是关键,那么你应该使用全文索引

LIKE实现起来比较简单,通常适用于less量的数据,但由于无法使用索引,所以数据量大,性能差。

对于大文本, 全文索引 快得多。 但是你也可以全文索引 varchar(max)

如果不将文本字段从文本转换为varchar,则无法search文本字段。

 declare @table table (a text) insert into @table values ('a') insert into @table values ('a') insert into @table values ('b') insert into @table values ('c') insert into @table values ('d') select * from @table where a ='a' 

这给了一个错误:

 The data types text and varchar are incompatible in the equal to operator. 

这不是:

 declare @table table (a varchar(max)) 

有趣的是, LIKE仍然有效,即

 where a like '%a%' 
  • 基本定义

TEXTVarChar(MAX)是非Unicode大的可变长度字符数据types,最大可存储2147483647个非Unicode字符(即最大存储容量为2GB)。

  • 哪一个使用?

根据MSDN链接 Microfostbuild议避免使用文本数据types,它将在未来版本的Sql Server中被删除。 Varchar(Max)是存储大string值而不是Text数据types的build议数据types。

  • 行内或行外存储

Texttypes列的数据在行外存储在单独的LOB数据页面中。 表格数据页面中的行只有一个16字节的指向实际数据所在的LOB数据页面的指针。 如果Varchar(max)types的数据小于或等于8000字节,则它们在行内存储。 如果Varchar(max)列值超过8000个字节,则Varchar(max)列值将存储在单独的LOB数据页中,并且行将只有一个16字节的指针指向存在实际数据的LOB数据页。 所以In-Row Varchar(Max)适合search和检索。

  • 支持/不支持的function

一些string函数,操作符或不能在Texttypes列上工作的构造,但是它们在VarChar(Max)types列上工作。

  1. =在VarChar(最大)types列上等于运算符
  2. 在VarChar(最大)types列上按分组进行分组

    • 系统IO注意事项

因为我们知道VarChar(Max)types的列值只有在要存储的值的长度大于8000字节或者行中没有足够的空间的情况下才会被asynchronous存储,否则它将会存储它在行。 因此,如果存储在VarChar(Max)列中的大部分值很大并且是行外存储的,那么数据检索行为将与Texttypes列的行为几乎相似。

但是,如果存储在VarChar(最大)types列中的大部分值足够小,可以存储在行内。 然后,检索不包含LOB列的数据需要读取更多数据页面,因为LOB列值存储在非LOB列值存储在同一数据页中的行内。 但是,如果select查询包含LOB列,那么与Texttypes列相比,它需要的数据检索页面数量较less。

结论

使用VarChar(MAX)数据types而不是TEXT来获得良好的性能。

资源

如果使用MS Access (特别是像2003这样的旧版本),你不得不在SQL Server上使用TEXT数据types,因为MS Access在Access中不能识别nvarchar(MAX)作为备注字段,而TEXT被识别为备忘录字段。