在SQL Server上使用varchar(MAX)与TEXT
我刚刚读到VARCHAR(MAX)
数据types(它可以存储接近2GB的char数据)是SQL Server 2005和下一个SQL SERVER版本中TEXT
数据types的推荐替代品。
如果我想在一列中search任何string,哪个操作更快?
-
对
VARCHAR(MAX)
列使用LIKE
子句?WHERE COL1 LIKE '%search string%'
-
使用
TEXT
列并在此列上放置一个全文索引 / 目录 ,然后使用CONTAINS
子句进行search?WHERE CONTAINS (Col1, 'MyToken')
VARCHAR(MAX)
types是TEXT
的替代品。 基本的区别在于TEXT
types将始终将数据存储在Blob中,而VARCHAR(MAX)
types将尝试将数据直接存储在行中,除非它超过了8k的限制,并且此时将其存储在blob中。
在两个数据types之间使用LIKE语句是相同的。 VARCHAR(MAX)
提供的附加function是它也可以与=
和GROUP BY
一起使用,就像任何其他的VARCHAR
列一样。 但是,如果确实有大量数据,则使用这些方法将会产生巨大的性能问题。
关于如果你应该使用LIKE
search,或者如果你应该使用全文索引和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%'
- 基本定义
TEXT
和VarChar(MAX)
是非Unicode大的可变长度字符数据types,最大可存储2147483647个非Unicode字符(即最大存储容量为2GB)。
- 哪一个使用?
根据MSDN链接 Microfostbuild议避免使用文本数据types,它将在未来版本的Sql Server中被删除。 Varchar(Max)是存储大string值而不是Text数据types的build议数据types。
- 行内或行外存储
Text
types列的数据在行外存储在单独的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列上工作。
-
=
在VarChar(最大)types列上等于运算符 -
在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
被识别为备忘录字段。