Czy pola „poza wierszem” są odczytywane, gdy używany jest indeks klastrowany?

10

Wiem, że kiedy VARCHAR(MAX)/NVARCHAR(MAX)kolumny są używane, dane są przechowywane out of the row- wiersz danych będzie miał wskaźnik do innej lokalizacji, w której przechowywana jest „duża wartość”.

Mam następujące pytania:

  1. Czy każde pole jest przechowywane, out of the rowczy tylko maxte?
  2. Jeśli używasz clustered indextabeli do odczytu całego rekordu, czy pola, które są przechowywane poza wierszem, są również odczytywane?

VARCHAR (MAX) lub NVARCHAR (MAX) jest uważany za „typ dużej wartości”. Typy dużych wartości są zwykle przechowywane „poza wierszem”. Oznacza to, że ...

gotqn
źródło
2
Skąd pochodzi ten ostatni cytowany fragment? To jest niepoprawne.
Paul White 9
3
Pełny tekst w oryginalnym wątku MSDN (autorstwa Jacoba Sebastiana) jest poprawny. Cytat „Przepełnienie stosu” trochę tego traci. Niewielka część tego, co cytowałeś powyżej, pomija wszystkie ważne fragmenty :)
Paul White 9

Odpowiedzi:

13

Wiem, że kiedy VARCHAR(MAX)/NVARCHAR(MAX)kolumny są używane, dane są przechowywane poza wierszem ...

W rzeczywistości zależy to od ustawienia large value types out of rowopcji, którą można ustawić za pomocą sp_tableoption. Z dokumentacji :

Ekstrakt BOL

Domyślny jest dla MAXwartości, które mają być przechowywane w wierszu , do 8000 bajtów, jeśli pasuje. O ile nie sp_tableoptionzmieniłeś ustawień domyślnych, Twoje MAXdane najprawdopodobniej będą przechowywane w rzędzie.

To powiedziawszy, złą praktyką jest używanie MAXtypów danych dla wartości, które nigdy nie przekroczą 8000 bajtów - zamiast tego należy używać typu innego niż MAX. Oprócz czegokolwiek innego, wydajność jest często znacznie niższa w przypadku MAXtypów, ponieważ SQL Server musi być przygotowany do radzenia sobie z danymi, które mogą mieć rozmiar do 2 GB.

Czy każde pole jest przechowywane poza wierszem, czy tylko te maksymalne?

Tylko MAXte. Ponadto, jeśli MAXkolumna poprzednio w wierszu zostanie przeniesiona poza wiersz, dotyczy to tylko tej kolumny w tym wierszu. Jest on zastępowany w wierszu wskaźnikiem do struktury poza wierszem LOB. Istnieją również okoliczności, w których kolumny inne niż MAX mogą zostać przeniesione poza wiersz.

Jeśli używasz indeksu klastrowego tabeli do odczytu całego rekordu, czy pola przechowywane poza wierszem również są odczytywane?

Skanowanie indeksu klastrowego przegląda tylko dane w wierszu. Jeśli dane do zapytania poza wierszem są potrzebne, są one wyszukiwane za pomocą wskaźnika w wierszu.

Paul White 9
źródło
Czy to zawsze prawda - Scanning the clustered index traverses only in-row data.? Na przykład, jeśli chcesz wyświetlać NVARCHAR(MAX)wartości pól, jak można pracować tylko z in-row-data(jeśli wartości są przechowywane poza wierszem)? Lub gdy używasz indeksu klastrowego (ponieważ nie ma indeksu pokrycia), ale nie zamierzasz korzystać workz NVARCHAR(MAX)pola, SQL Server jest wystarczająco sprytny, aby to zobaczyć i pominąć wyszukiwanie out-of-rowdanych?
gotqn
Dziękuję za odpowiedź. Wreszcie, jeśli masz dwie kolumny - inti nvarchar(max)wybierasz tylko intkolumnę, SQL Server nie marnuje zasobów readna out-of-rowdane, ponieważ wie, że nie zamierzasz ich użyć?
gotqn
Wielkie dzięki. To bardzo miłe. Wydaje się, że za pomocą tego sp_tableoptionmożna usunąć z tabeli wszystko, co nie jest często używane w celu zmniejszenia wielkości wiersza, gdy wykonuje się wiele indeksów klastrowych poszukujących / skanujących.
gotqn
3
@gotqn Tak. Off-rząd był domyślnym dla starych typów LOB text, ntexti image. Oczywiście można również przechowywać duże typy w osobnej tabeli.
Paul White 9
4

To zachowanie w przypadku przechowywania dużych obiektów można kontrolować za pomocą ustawienia tabeli:

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

Odwołanie w dokumentacji programu SQL Server 2012 znajduje się pod adresem : http://msdn.microsoft.com/en-us/library/ms173530.aspx

Dlatego możesz kontrolować, gdzie miejsce jest używane, w rzędzie lub przechowywane poza rzędem.

RLF
źródło
Dzięki, naprawdę nie wiedziałem, że jesteś w stanie to kontrolować.
gotqn