Вопрос

Я только что прочитал, что VARCHAR(MAX) тип данных (который может хранить около 2 ГБ данных char) является рекомендуемой заменой TEXT тип данных в SQL Server 2005 и следующих версиях 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%'
  • Базовое определение

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

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

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

  • Хранение в ряд или Вне ряда

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

  • Поддерживаемые / Неподдерживаемые функциональные возможности

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

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

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

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

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

Заключение

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

Источник

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top