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

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

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

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

    WHERE COL1 LIKE '%search string%'

  2. С помощью

5 ответов


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

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

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

если вы ищете большое количество текста и производительность является ключевым, то вы должны использовать Полный Текст Индекс.

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


для большого текста полнотекстовый индекс is много быстрее. Но ты можешь!--2-->полнотекстовый индекс 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.

Wheras это не делает:

declare @table table (a varchar(max))

интересно, что LIKE все еще работает, т. е.

where a like '%a%'

  • Основные Понятия

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

  • какую использовать?

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

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

данные 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), большие и хранятся вне строки, поведение извлечения данных будет почти таким же, как у столбца текстового типа.

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

вывод

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

источник


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