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

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

  1. 使用一个 LIKE 条款反对 VARCHAR(MAX) 柱子?

    WHERE COL1 LIKE '%search string%'

  2. 使用 TEXT 列并放置一个 全文索引/目录 在此列上,然后使用 CONTAINS 条款?

    WHERE CONTAINS (Col1, 'MyToken')

有帮助吗?

解决方案

VARCHAR(MAX)类型是 TEXT 的替代品。基本区别在于 TEXT 类型总是将数据存储在blob中,而 VARCHAR(MAX)类型将尝试将数据直接存储在行中,除非它超过8k限制,此时它将它存储在一个blob中。

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

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

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

LIKE 更易于实现,并且通常适用于少量数据,但由于无法使用索引,因此大数据的性能极差。

其他提示

对于大文本,全文索引更快 。但您也可以全文索引 varchar(max)

如果不将文本字段从文本转换为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'

这会出错:

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 大变长字符数据类型,最多可存储 2147483647 个非 Unicode 字符(即最大存储容量为:2GB)。

  • 使用哪一个?

按照 MSDN链接 Microsoft 建议避免使用 Text 数据类型,它将在 Sql Server 的未来版本中删除。Varchar(Max) 是用于存储大字符串值的建议数据类型,而不是文本数据类型。

  • 行内或行外存储

的数据 Text type 列存储在行外的单独 LOB 数据页中。表数据页中的行只有一个 16 字节的指针,指向实际数据所在的 LOB 数据页。而a的数据 Varchar(max) 如果 type 列小于或等于 8000 字节,则存储在行中。如果 Varchar(max) 列值超过 8000 字节,则 Varchar(max) 列值将存储在单独的 LOB 数据页中,并且行将仅具有指向实际数据所在的 LOB 数据页的 16 字节指针。所以 In-Row Varchar(Max) 适合搜索和检索。

  • 支持/不支持的功能

某些字符串函数、运算符或结构在 Text 类型列上不起作用,但在 VarChar(Max) 类型列上起作用。

  1. = VarChar(Max) 类型列上的等于运算符
  2. VarChar(Max) 类型列上的 Group by 子句

    • 系统 IO 注意事项

我们知道,VarChar(Max)类型的列值只有当要存储的值的长度大于8000字节或者行中没有足够的空间时才会存储在行外,否则会存储它在行中。因此,如果存储在 VarChar(Max) 列中的大多数值都很大并且存储在行外,则数据检索行为几乎与 Text 类型列的行为类似。

但是,如果存储在 VarChar(Max) 类型列中的大多数值足够小,可以存储在行中。然后,检索不包含 LOB 列的数据需要读取更多数据页,因为 LOB 列值按行存储在存储非 LOB 列值的同一数据页中。但是,如果选择查询包含 LOB 列,则与文本类型列相比,它需要读取更少的页数来进行数据检索。

结论

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

来源

如果使用 MS Access (特别是像2003这样的旧版本),则必须在SQL Server上使用 TEXT 数据类型,因为MS Access无法识别 nvarchar(MAX) )作为Access中的备注字段,而 TEXT 被识别为备注字段。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top