206

我刚刚读到该VARCHAR(MAX)数据类型(可以存储接近 2GB 的 char 数据)是TEXTSQL Server 2005 和 Next SQL SERVER 版本中数据类型的推荐替代品。

如果我想在列中搜索任何字符串,哪个操作更快?

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

    WHERE COL1 LIKE '%search string%'

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

    WHERE CONTAINS (Col1, 'MyToken')

4

5 回答 5

335

VARCHAR(MAX)类型是TEXT. 基本区别在于,一个TEXT类型将始终将数据存储在 blob 中,而该VARCHAR(MAX)类型将尝试将数据直接存储在行中,除非它超过 8k 限制并且此时它将其存储在 blob 中。

在两种数据类型之间使用 LIKE 语句是相同的。为您提供的附加功能VARCHAR(MAX)是它也可以与=任何GROUP BY其他VARCHAR列一起使用。但是,如果您确实有大量数据,则使用这些方法将遇到巨大的性能问题。

关于是否应该使用LIKE搜索,或者是否应该使用全文索引CONTAINS. 无论VARCHAR(MAX)or ,这个问题都是一样的TEXT

如果您正在搜索大量文本并且性能是关键,那么您应该使用全文索引

LIKE实现起来更简单,通常适用于少量数据,但由于无法使用索引,因此在处理大数据时性能极差。

于 2009-05-07T14:10:28.130 回答
18

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

于 2009-05-07T13:58:06.320 回答
16

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

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'

这会给你错误:

数据类型textvarchar在等于运算符中不兼容。

而这不是:

DECLARE @table TABLE (a varchar(max))

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

WHERE a LIKE '%a%'
于 2009-05-07T14:00:06.877 回答
12
  • 基本定义

TEXT并且VarChar(MAX)是非Unicode大变长字符数据类型,最多可存储2,147,483,647个非Unicode字符(即最大存储容量为:2GB)。

  • 使用哪一个?

根据MSDN,Microsoft 建议避免使用该TEXT数据类型,它将在 SQL Server 的未来版本中删除。VarChar(MAX)是存储大字符串值而不是数据类型的建议数据TEXT类型。

  • 行内或行外存储

类型列的数据以TEXT行外方式存储在单独的 LOB 数据页中。表数据页中的行将只有一个 16 字节指针,指向实际数据所在的 LOB 数据页。如果类型列的数据VarChar(MAX)小于或等于 8000 字节,则将其存储在行内。如果VarChar(MAX)列的值大于 8000 字节,则VarChar(MAX)列值存储在单独的 LOB 数据页中,并且行将只有一个 16 字节指针,指向实际数据所在的 LOB 数据页。所以“行内”VarChar(MAX)有利于搜索和检索。

  • 支持/不支持的功能

某些字符串函数、运算符和构造不适用于TEXT类型列,但它们确实适用于VarChar(MAX)类型列。

  1. =等于VarChar(MAX)类型列上的运算符
  2. GROUP BYVarChar(MAX)类型列上的子句
  • 系统 IO 注意事项

众所周知,VarChar(MAX)类型列的值只有在值的长度大于 8000 字节或者行中没有足够的空间时才会被存储在行外,否则会被存储在行内。因此,如果存储在VarChar(MAX)列中的大多数值都很大并且存储在行外,则数据检索行为将几乎类似于TEXT类型列。

如果存储在类型列中的大多数值VarChar(MAX)都足够小以存储在行内,则检索不包含 LOB 列的数据需要读取更多数据页,因为 LOB 列值存储在同一数据中的行内存储非 LOB 列值的页面。但是,如果查询包含 LOB 列,则与类型列SELECT相比,它需要为数据检索读取的页面更少。TEXT

结论

使用VarChar(MAX)数据类型而不是TEXT获得更好的性能。

来源

于 2016-08-12T09:25:39.497 回答
5

如果使用MS Access(尤其是 2003 等旧版本),您将被迫TEXT在 SQL Server 上使用数据类型,因为 MS Access 不能识别nvarchar(MAX)为 Access 中的备注字段,而TEXT被识别为备注字段。

于 2013-09-16T20:45:04.087 回答