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

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

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

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

    WHERE COL1 LIKE '%search string%'

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

    WHERE CONTAINS (Col1, 'MyToken')

Ответ 1

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

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

В отношении того, следует ли использовать LIKE для поиска или использовать полнотекстовую индексацию и CONTAINS. Этот вопрос одинаковый независимо от VARCHAR(MAX) или TEXT.

Если вы ищете большое количество текста и производительность, тогда вы должны использовать полный текстовый индекс.

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

Ответ 2

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

Ответ 3

Вы не можете искать текстовое поле, не преобразовывая его из текста в 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%'

Ответ 4

  • Основное определение

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

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

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

  • Хранилище In-Row или Out-of-Row

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

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

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

  • = Обозначить оператор в столбце типа VarChar (Max)
  • Групповое предложение по столбцу типа VarChar (Max)

    • Состояния системы IO

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

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

Заключение

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

Источник

Ответ 5

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