Чи читаються поля "поза рядка", коли використовується кластерний індекс?


10

Я знаю, що при VARCHAR(MAX)/NVARCHAR(MAX)використанні стовпців дані зберігаються out of the row- рядок даних матиме вказівник на інше місце, де зберігається "велике значення".

У мене є такі питання:

  1. Чи зберігається кожне поле out of the rowчи лише те max?
  2. Якщо ви використовуєте clustered indexтаблицю для читання всього запису, чи читаються також поля, які зберігаються поза рядком?

VARCHAR (MAX) або NVARCHAR (MAX) розглядається як "тип великого значення". Типи великих значень зазвичай зберігаються "поза рядом". Це означає, що ...


2
Звідки взявся цей останній цитований шматочок? Це не правильно.
Пол Білий 9


3
Повний текст в оригінальній темі MSDN (від Якова Себастьяна) є правильним. "Цитата" переповнення стека втрачає досить багато цього. Невелика частка того, що ви цитували вище, утримує всі важливі шматочки :)
Пол Білий 9

Відповіді:


13

Я знаю, що при VARCHAR(MAX)/NVARCHAR(MAX)використанні стовпців дані зберігаються поза рядка ...

Власне, це залежить від налаштування large value types out of rowпараметра, який можна встановити за допомогою sp_tableoption. З документації :

Екстракт BOL

За замовчуванням для MAXзначень , які будуть зберігатися в построчно , до 8000 байт, якщо вони підходять. Якщо ви не використовували sp_tableoptionдля зміни стандартних MAXданих , ваші дані, швидше за все, зберігатимуться в рядку.

З огляду на це, поганою практикою є використання MAXтипів даних для значень, які ніколи не перевищуватимуть 8000 байт - замість цього використовується тип, не MAX. Крім усього іншого, продуктивність часто значно слабша при роботі з MAXтипами, тому що SQL Server повинен бути готовий впоратися з даними, розміром яких може бути до 2 Гб.

Чи зберігається кожне поле поза рядка чи лише максимум?

Тільки MAXті. Крім того, якщо попередньо MAXстовпець, що перебуває в рядку , переміщений поза рядком, впливає лише цей стовпець у цьому рядку. Він замінюється в рядку вказівником на структуру поза рядків LOB. Також є обставини, коли стовпці, що не містять MAX, можуть бути переміщені поза рядком.

Якщо ви використовуєте кластерний індекс таблиці, щоб прочитати весь запис, чи читаються також поля, які зберігаються поза рядком?

Сканування кластеризованого індексу проходить лише в рядкових даних. Якщо для запиту потрібні дані між рядками, вони шукаються за допомогою вказівника рядка.


Це завжди правда - Scanning the clustered index traverses only in-row data.? Наприклад, якщо ви хочете відображати NVARCHAR(MAX)значення полів, як можна працювати тільки з in-row-data(якщо значення зберігаються поза рядка)? Або коли ви використовуєте кластерний індекс (оскільки немає індексу покриття), але ви не збираєтеся workвикористовувати NVARCHAR(MAX)поле, SQL Server є досить розумним, щоб побачити це і пропустити погляд до out-of-rowданих?
gotqn

Дякую за відповідь. Таким чином, в кінці кінців, якщо у вас є дві колонки - intі , nvarchar(max)і ви вибираєте тільки intстовпець, то SQL-сервер не витрачає ресурси на readна out-of-rowданих , як він знає , що ви не збираєтеся використовувати його?
gotqn

Дуже дякую. Це дуже приємно. Здається, що за допомогою програми sp_tableoptionви можете винести з таблиці все, що не часто використовується для зменшення розміру рядка, коли робиться багато кластерних пошукових запитів / сканувань.
gotqn

3
@gotqn Так. Off-рядок була за замовчуванням для старих типів великих об'єктів text, ntextі image. Ви, звичайно, також можете зберігати великі типи в окремій таблиці.
Пол Білий 9

4

Таку поведінку для зберігання великих об'єктів можна керувати налаштуваннями таблиці:

exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>

Довідка в документації на SQL Server 2012 знаходиться за посиланням: http://msdn.microsoft.com/en-us/library/ms173530.aspx

Тому ви можете керувати місцем, де використовується простір або зберігається поза рядком.


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