Использование varchar (MAX) vs TEXT на SQL Server
Я только что прочитал, что VARCHAR(MAX)
тип данных (который может хранить близко к 2 ГБ данных char) является рекомендуемой заменой для TEXT
тип данных в SQL Server 2005 и следующих версиях SQL SERVER.
если я хочу искать внутри столбца для любой строки, какая операция быстрее?
-
С помощью
LIKE
п. с ?WHERE COL1 LIKE '%search string%'
-
С помощью
5 ответов:
The
VARCHAR(MAX)
тип является заменойTEXT
. Основное различие заключается в том, чтоTEXT
тип всегда будет хранить данные в BLOB-аVARCHAR(MAX)
тип попытается сохранить данные непосредственно в строке, если он не превышает ограничение 8k, и в этот момент он сохраняет его в большом двоичном объекте.использование оператора LIKE идентично между двумя типами данных. Дополнительный функционал
VARCHAR(MAX)
дает вам то, что он также может быть использован с=
иGROUP BY
как и любой другие может быть. Однако, если у вас есть много данных, у вас будет огромная проблема с производительностью, используя эти методы.в отношении того, если вы должны использовать
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 link Microsoft предлагает избегать использования текстового типа данных, и он будет удален в будущих версиях SQL-сервер. Varchar (Max) - это рекомендуемый тип данных для хранения больших строковых значений вместо текстового типа данных.
- хранение в строке или вне строки
данные a
Text
столбец типа хранится вне строки на отдельных страницах данных LOB. Строка на странице данных таблицы будет иметь только 16-байтовый указатель на страницу данных LOB, где присутствуют фактические данные. В то время как данныеVarchar(max)
тип столбца хранится в строке, если он меньше или равная 8000 байт. Если значение столбца Varchar(max) пересекает 8000 байт, то значение столбца Varchar (max) хранится в отдельной странице данных LOB, а строка будет иметь только 16-байтовый указатель на страницу данных LOB, где присутствуют фактические данные. Так чтоIn-Row
Varchar (Max) хорошо подходит для поиска и извлечения.
- Поддерживаемые/Неподдерживаемые Функции
некоторые строковые функции, операторы или конструкции, которые не работают в столбце типа текста, но они работают в столбце типа VarChar(Max).
=
равно оператору на столбце типа VarChar(Max)предложение Group by для столбца типа VarChar(Max)
- требования к системе ввода-вывода
как мы знаем, значения столбцов типа VarChar(Max) хранятся вне строки только в том случае, если длина значения, которое будет храниться в нем, превышает 8000 байт или в строке недостаточно места, иначе он будет хранить его в строке. Поэтому, если большинство значений, хранящихся в столбце VarChar(Max), являются большими и хранятся вне строки, поведение извлечения данных будет почти похоже на поведение столбца типа Text.
но если большинство значений, хранящихся в Столбцах типа VarChar (Max), достаточно малы для хранения в строке. Затем для извлечения данных, в которых столбцы LOB не включены, требуется большее количество страниц данных для чтения в качестве столбца LOB значение хранится в строке на той же странице данных, где хранятся значения столбцов без LOB. Но если запрос select содержит столбец LOB, то для его чтения требуется меньше страниц для извлечения данных по сравнению со столбцами типа Text.
вывод
использовать
VarChar(MAX)
тип данных, а неTEXT
за хорошую работу.