Использование varchar (MAX) против TEXT на SQL Server - PullRequest
181 голосов
/ 07 мая 2009

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

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

  1. Использование предложения LIKE для столбца VARCHAR(MAX)?

    WHERE COL1 LIKE '%search string%'

  2. Используя столбец TEXT и поместите Полнотекстовый индекс / Каталог в этот столбец, а затем выполните поиск с помощью предложения CONTAINS?

    WHERE CONTAINS (Col1, 'MyToken')

Ответы [ 5 ]

296 голосов
/ 07 мая 2009

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

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

Относительно того, следует ли использовать LIKE для поиска или следует использовать Полнотекстовое индексирование и CONTAINS. Этот вопрос один и тот же, независимо от VARCHAR(MAX) или TEXT.

Если вы ищете большой объем текста и производительность является ключевым фактором, вам следует использовать Полнотекстовый индекс .

LIKE проще в реализации и часто подходит для небольших объемов данных, но имеет очень низкую производительность с большими данными из-за невозможности использования индекса.

17 голосов
/ 07 мая 2009

Для большого текста полнотекстовый индекс намного быстрее . Но вы также можете полный текстовый индекс varchar(max).

15 голосов
/ 07 мая 2009

Вы не можете искать текстовое поле, не преобразовав его из текста в 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%'
8 голосов
/ 12 августа 2016
  • Базовое определение

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

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

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

  • Хранение в ряд или вне строки

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

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

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

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

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

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

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

Заключение

Используйте VarChar(MAX) тип данных вместо TEXT для хорошей производительности.

Источник

4 голосов
/ 17 сентября 2013

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

...