Использование varchar (MAX) vs TEXT на SQL Server


Я только что прочитал, что VARCHAR(MAX) тип данных (который может хранить близко к 2 ГБ данных char) является рекомендуемой заменой для TEXT тип данных в SQL Server 2005 и следующих версиях SQL SERVER.

если я хочу искать внутри столбца для любой строки, какая операция быстрее?

  1. С помощью LIKE п. с ?

    WHERE COL1 LIKE '%search string%'

  2. С помощью

5 175

5 ответов:

The VARCHAR(MAX) тип является заменой TEXT. Основное различие заключается в том, что TEXT тип всегда будет хранить данные в BLOB-а VARCHAR(MAX) тип попытается сохранить данные непосредственно в строке, если он не превышает ограничение 8k, и в этот момент он сохраняет его в большом двоичном объекте.

использование оператора LIKE идентично между двумя типами данных. Дополнительный функционал VARCHAR(MAX) дает вам то, что он также может быть использован с = и GROUP BY как и любой другие может быть. Однако, если у вас есть много данных, у вас будет огромная проблема с производительностью, используя эти методы.

в отношении того, если вы должны использовать 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%'
  • Основные Понятия

TEXT и VarChar(MAX) - Это тип данных с большой переменной длиной без Юникода, который может хранить максимум 2147483647 символов без Юникода (т. е. максимальный объем памяти: 2 ГБ).

  • какой из них использовать?

по состоянию на MSDN link Microsoft предлагает избегать использования текстового типа данных, и он будет удален в будущих версиях SQL-сервер. Varchar (Max) - это рекомендуемый тип данных для хранения больших строковых значений вместо текстового типа данных.

  • хранение в строке или вне строки

данные a Text столбец типа хранится вне строки на отдельных страницах данных LOB. Строка на странице данных таблицы будет иметь только 16-байтовый указатель на страницу данных LOB, где присутствуют фактические данные. В то время как данные Varchar(max) тип столбца хранится в строке, если он меньше или равная 8000 байт. Если значение столбца Varchar(max) пересекает 8000 байт, то значение столбца Varchar (max) хранится в отдельной странице данных LOB, а строка будет иметь только 16-байтовый указатель на страницу данных LOB, где присутствуют фактические данные. Так что In-Row Varchar (Max) хорошо подходит для поиска и извлечения.

  • Поддерживаемые/Неподдерживаемые Функции

некоторые строковые функции, операторы или конструкции, которые не работают в столбце типа текста, но они работают в столбце типа VarChar(Max).

  1. = равно оператору на столбце типа VarChar(Max)
  2. предложение Group by для столбца типа VarChar(Max)

    • требования к системе ввода-вывода

как мы знаем, значения столбцов типа VarChar(Max) хранятся вне строки только в том случае, если длина значения, которое будет храниться в нем, превышает 8000 байт или в строке недостаточно места, иначе он будет хранить его в строке. Поэтому, если большинство значений, хранящихся в столбце VarChar(Max), являются большими и хранятся вне строки, поведение извлечения данных будет почти похоже на поведение столбца типа Text.

но если большинство значений, хранящихся в Столбцах типа VarChar (Max), достаточно малы для хранения в строке. Затем для извлечения данных, в которых столбцы LOB не включены, требуется большее количество страниц данных для чтения в качестве столбца LOB значение хранится в строке на той же странице данных, где хранятся значения столбцов без LOB. Но если запрос select содержит столбец LOB, то для его чтения требуется меньше страниц для извлечения данных по сравнению со столбцами типа Text.

вывод

использовать VarChar(MAX) тип данных, а не TEXT за хорошую работу.

источник

при использовании MS Access (особенно старые версии, такие как 2003) вы вынуждены использовать TEXT тип данных на SQL Server как MS Access не распознает nvarchar(MAX) Как поле Memo в Access, тогда как TEXT распознается как Memo-поле.