Я только что прочитал, что 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')
sql-server
performance
text
varchar
sql-types
user85116
источник
источник
TEXT
иNTEXT
(иIMAGE
) не рекомендуется.Ответы:
VARCHAR(MAX)
Типа является заменойTEXT
. Основное отличие состоит в том, чтоTEXT
тип всегда будет хранить данные в BLOB-объекте, тогда какVARCHAR(MAX)
тип будет пытаться хранить данные непосредственно в строке, если он не превышает ограничение 8 Кбайт, и в этот момент он сохраняет их в BLOB-объекте.Использование оператора LIKE одинаково для двух типов данных. Дополнительный функционал
VARCHAR(MAX)
дает вам то, что он также может быть использован=
иGROUP BY
как любой другойVARCHAR
столбец может быть. Однако, если у вас много данных, у вас возникнут огромные проблемы с производительностью при использовании этих методов.Относительно того, следует ли вам использовать
LIKE
поиск или использовать полнотекстовое индексирование иCONTAINS
. Этот вопрос один и тот же независимо отVARCHAR(MAX)
илиTEXT
.Если вы ищете большой объем текста и производительность является ключевым фактором, вам следует использовать полнотекстовый индекс .
LIKE
Проще реализовать и часто подходит для небольших объемов данных, но у него крайне низкая производительность при работе с большими данными из-за невозможности использования индекса.источник
Для большого текста, полнотекстовый индекс является гораздо быстрее. Но вы можете также полнотекстовый индекс
varchar(max)
.источник
Вы не можете искать текстовое поле, не преобразовав его из текста в varchar.
Это дает ошибку:
Wheras это не:
Интересно, что
LIKE
до сих пор работает, т.е.источник
varchar(n)
илиtext
, и обойти этот ответ. Как вы думаете, в профессиональной среде спор с расплывчатыми высказываниями поможет решить проблему? Все посты на StackOverflow предназначены для просмотра тысячами людей, действуйте в результате!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-Row
Varchar (Max) хорош для поиска и поиска.Некоторые строковые функции, операторы или конструкции, которые не работают со столбцом типа Text, но они работают со столбцом типа VarChar (Max).
=
Равно Оператору в столбце типа VarChar (Max)Группировать по выражению в столбце типа VarChar (Max)
Поскольку мы знаем, что значения столбца типа VarChar (Max) хранятся вне строки, только если длина значения, которое должно быть сохранено в нем, превышает 8000 байт или недостаточно места в строке, в противном случае он будет хранить это в ряд. Таким образом, если большая часть значений, хранящихся в столбце VarChar (Max), является большой и хранится вне строки, поведение при извлечении данных будет почти таким же, как в столбце типа «Текст».
Но если большинство значений, хранящихся в столбцах типа VarChar (Max), достаточно малы для хранения в строке. Затем для извлечения данных, в которые не включены столбцы большого объекта, требуется большее количество страниц данных для чтения, поскольку значение столбца большого объекта хранится в строке на той же странице данных, где хранятся значения столбца без большого объекта. Но если запрос на выборку включает столбец LOB, то для извлечения данных требуется меньше страниц для чтения по сравнению со столбцами типа Text.
Вывод
Используйте
VarChar(MAX)
тип данных, а неTEXT
для хорошей производительности.Источник
источник
При использовании MS Access (особенно в более старых версиях, таких как 2003) вы вынуждены использовать
TEXT
тип данных на SQL Server, поскольку MS Access не распознаетnvarchar(MAX)
Memo-поле в Access, аTEXT
распознается как Memo-поле.источник