Я знаю, що при VARCHAR(MAX)/NVARCHAR(MAX)
використанні стовпців дані зберігаються поза рядка ...
Власне, це залежить від налаштування large value types out of row
параметра, який можна встановити за допомогою sp_tableoption
. З документації :
За замовчуванням для MAX
значень , які будуть зберігатися в построчно , до 8000 байт, якщо вони підходять. Якщо ви не використовували sp_tableoption
для зміни стандартних MAX
даних , ваші дані, швидше за все, зберігатимуться в рядку.
З огляду на це, поганою практикою є використання MAX
типів даних для значень, які ніколи не перевищуватимуть 8000 байт - замість цього використовується тип, не MAX. Крім усього іншого, продуктивність часто значно слабша при роботі з MAX
типами, тому що SQL Server повинен бути готовий впоратися з даними, розміром яких може бути до 2 Гб.
Чи зберігається кожне поле поза рядка чи лише максимум?
Тільки MAX
ті. Крім того, якщо попередньо MAX
стовпець, що перебуває в рядку , переміщений поза рядком, впливає лише цей стовпець у цьому рядку. Він замінюється в рядку вказівником на структуру поза рядків LOB
. Також є обставини, коли стовпці, що не містять MAX, можуть бути переміщені поза рядком.
Якщо ви використовуєте кластерний індекс таблиці, щоб прочитати весь запис, чи читаються також поля, які зберігаються поза рядком?
Сканування кластеризованого індексу проходить лише в рядкових даних. Якщо для запиту потрібні дані між рядками, вони шукаються за допомогою вказівника рядка.