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

196

Я только что прочитал, что 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')

user85116
источник
1
Это сообщение также полезно: stackoverflow.com/questions/564755/…
Джейк
26
Самое важное упоминание в этом посте - это ссылка на документацию MSDN, показывающую, что TEXTи NTEXTIMAGE) не рекомендуется.
Брайан
Посмотрите на ссылку: stackoverflow.com/q/28980502/1805776
Вики

Ответы:

316

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

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

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

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

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

Робин Дэй
источник
12
Я не знал, что он будет храниться на странице в 8k, и вне страницы, если больше. Очень круто.
Brain2000
3
Ваша последняя строка частично неверна. LIKE не может использовать индекс ТОЛЬКО, если подстановочный знак находится в начале искомой строки.
SouravA
1
Не проблема ли изменить поле из текста в varchar (max) из существующей таблицы с данными?
user1531040
17

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

Джоэл Коухорн
источник
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'

Это дает ошибку:

The data types text and varchar are incompatible in the equal to operator.

Wheras это не:

declare @table table (a varchar(max))

Интересно, что LIKEдо сих пор работает, т.е.

where a like '%a%'
DForck42
источник
11
+1 только за случайное понижение голоса! Меня сводит с ума, когда люди отрицают меня и не имеют комментариев, им действительно нужно получить жизнь.
Том Стиккель
3
Причина, по которой он получил отрицательные отзывы, состоит в том, что из того, что я помню из того, что я должен был сделать , нет веского аргумента, чтобы приводить ответ на технический вопрос. Подумайте о людях (таких как я прямо сейчас), пытающихся выяснить, почему мы должны использовать varchar(n)или text, и обойти этот ответ. Как вы думаете, в профессиональной среде спор с расплывчатыми высказываниями поможет решить проблему? Все посты на StackOverflow предназначены для просмотра тысячами людей, действуйте в результате!
Анвар
3
@Zeratops LOL, этому ответу 6 лет, я был довольно зелен, поэтому, когда я написал это. я очистил формулировку, чтобы быть ближе к делу.
DForck42
9
  • Основное определение

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

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

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

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

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

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

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

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

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

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

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

Вывод

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

Источник

Сомнат Мулук
источник
5

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

Клаус Обердальхофф
источник