Використання varchar (MAX) проти TEXT на SQL Server


196

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

Якщо я хочу шукати всередині стовпця для будь-якого рядка, яка операція швидша?

  1. Використовуючи LIKEпункт проти VARCHAR(MAX)стовпця?

    WHERE COL1 LIKE '%search string%'

  2. Використовуючи TEXTстовпець і поставте в цей стовпець повний текстовий індекс / каталог , а потім шукайте за допомогою CONTAINSпункту?

    WHERE CONTAINS (Col1, 'MyToken')


1
Ця публікація також корисна: stackoverflow.com/questions/564755/…
Джейк

25
Найголовніша згадка в цій публікації - це посилання на документацію MSDN, яка показує, що TEXTта NTEXTIMAGE) застарілі.
Брайан

Подивіться за посиланням: stackoverflow.com/q/28980502/1805776
vicky

Відповіді:


316

VARCHAR(MAX)Типу є заміною TEXT. Основна відмінність полягає в тому, що TEXTтип завжди буде зберігати дані в блобі, тоді як VARCHAR(MAX)тип буде намагатися зберігати дані безпосередньо в рядку, якщо це не перевищує обмеження 8k, і в цей момент він зберігає їх у краплі.

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

Що стосується того, чи слід використовувати LIKEдля пошуку, чи ви повинні використовувати повну індексацію тексту та CONTAINS. Це питання те саме, незалежно від VARCHAR(MAX)або TEXT.

Якщо ви шукаєте велику кількість тексту, а продуктивність є ключовою, тоді вам слід використовувати повний текстовий індекс .

LIKE простіший у застосуванні і часто підходить для невеликих обсягів даних, але він має надзвичайно низьку продуктивність з великими даними через неможливість використання індексу.


12
Я не знав, що він зберігатиметься на сторінці в 8k, а поза сторінкою, якщо більший. Дуже круто.
Brain2000

3
Ваш останній рядок частково неправильний. LIKE не може використовувати індекс ТОЛЬКО, якщо підкреслений знак знаходиться на початку рядка, в якому здійснюється пошук.
SouravA

1
Хіба це не проблема змінити поле з тексту в varchar (max) з існуючої таблиці з даними?
користувач1531040

17

Для великого тексту, повнотекстовий індекс є набагато швидше. Але ви також можете заповнити повний текстовий покажчик varchar(max) .


16

Ви не можете шукати текстове поле, не перетворюючи його з тексту у 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%'

11
+1 просто для того, щоб сказати випадкову трансляцію! Зводить мене з розуму, коли люди прихильнюють мене і не мають коментарів, їм дійсно потрібно життя.
Том Стікель

3
Причина, яку він отримав протилежно, - це те, що я пам’ятаю з тих речей, які мені довелося зробити , не є вагомим аргументом, який можна наводити, відповідаючи на технічне запитання. Подумайте про людей (як я зараз) , намагаючись firgure, чому ми повинні використовувати varchar(n)або text, і отримати за це. Як ви думаєте, в професійному середовищі, що сперечатися з невиразними твердженнями допоможе вирішити проблему? Весь пост у StackOverflow призначений для того, щоб його побачили тисячі людей, діяв наслідки!
Анвар

3
@Zeratops lol, цій відповіді 6 років, я був досить зеленим до цього, коли я писав це. Я прибрав формулювання, щоб бути більш точним.
DForck42

9
  • Основне визначення

TEXTі VarChar(MAX)є великим типом даних символів змінної довжини Non-Unicode, який може зберігати максимум 2147483647 символів Non-Unicode (тобто максимальна ємність пам’яті: 2 ГБ).

  • Який використовувати?

Відповідно до посилання MSDN, Microsoft пропонує уникати використання типу даних Text, і він буде видалений у майбутніх версіях сервера Sql. Varchar (Max) - це запропонований тип даних для зберігання великих рядкових значень замість типу даних Text.

  • In-Row або Out-of-Red Storage

Дані Textстовпця типу зберігаються поза рядками на окремих сторінках даних LOB. Рядок на сторінці даних таблиці матиме лише 16-байтний вказівник на сторінку даних LOB, де є фактичні дані. У той час як Дані Varchar(max)стовпця типу зберігаються в рядку, якщо він менше або дорівнює 8000 байт. Якщо значення стовпчика Varchar (max) перетинає 8000 байт, то значення стовпця Varchar (max) зберігається на окремих сторінках даних LOB, а рядок матиме лише 16-байтовий покажчик на сторінці даних LOB, де є фактичні дані. Тож In-RowВарчар (Макс) хороший для пошуку та пошуку.

  • Підтримувані / непідтримувані функції

Деякі з рядкових функцій, операторів чи конструкцій, які не працюють у стовпці Тип тексту, але вони працюють у стовпці типу VarChar (Max).

  1. = Дорівнює Оператору в стовпці типу VarChar (Max)
  2. Згрупуйте за пунктом у колонці типу VarChar (Max)

    • Міркування щодо системного вводу

Як ми знаємо, що значення стовпців типу VarChar (Max) зберігаються поза рядками, лише якщо довжина значення, яке потрібно зберегти в ньому, перевищує 8000 байт або в рядку недостатньо місця, інакше воно буде зберігатися це в ряд. Отже, якщо більшість значень, що зберігаються у стовпці VarChar (Max), є великими і зберігаються поза рядками, поведінка пошуку даних буде майже аналогічна тій, що у колонці типу Text.

Але якщо більшість значень, що зберігаються у стовпцях типу VarChar (Max), є досить малими для зберігання в рядку. Тоді для отримання даних, де стовпці LOB не включені, потрібна більша кількість сторінок даних для зчитування, оскільки значення стовпця LOB зберігається в рядку на тій самій сторінці даних, де зберігаються значення стовпців, які не є LOB. Але якщо запит вибору включає стовпчик LOB, тоді для пошуку даних потрібно менше кількості сторінок для читання, порівняно зі стовпцями типу Text.

Висновок

Використовуйте VarChar(MAX)тип даних, а не TEXTдля хорошої продуктивності.

Джерело


5

Якщо ви використовуєте MS Access (особливо старіші версії, такі як 2003), ви змушені використовувати TEXTтип даних на SQL Server, оскільки MS Access не визнає nvarchar(MAX)поле пам'яті в Access, тоді TEXTяк розпізнається як поле пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.