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:
- Czy każde pole jest przechowywane,
out of the row
czy tylkomax
te? - Jeśli używasz
clustered index
tabeli 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 ...
Odpowiedzi:
W rzeczywistości zależy to od ustawienia
large value types out of row
opcji, którą można ustawić za pomocąsp_tableoption
. Z dokumentacji :Domyślny jest dla
MAX
wartości, które mają być przechowywane w wierszu , do 8000 bajtów, jeśli pasuje. O ile niesp_tableoption
zmieniłeś ustawień domyślnych, TwojeMAX
dane najprawdopodobniej będą przechowywane w rzędzie.To powiedziawszy, złą praktyką jest używanie
MAX
typó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 przypadkuMAX
typów, ponieważ SQL Server musi być przygotowany do radzenia sobie z danymi, które mogą mieć rozmiar do 2 GB.Tylko
MAX
te. Ponadto, jeśliMAX
kolumna 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 wierszemLOB
. Istnieją również okoliczności, w których kolumny inne niż MAX mogą zostać przeniesione poza wiersz.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.
źródło
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 zin-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ćwork
zNVARCHAR(MAX)
pola, SQL Server jest wystarczająco sprytny, aby to zobaczyć i pominąć wyszukiwanieout-of-row
danych?int
invarchar(max)
wybierasz tylkoint
kolumnę, SQL Server nie marnuje zasobówread
naout-of-row
dane, ponieważ wie, że nie zamierzasz ich użyć?sp_tableoption
moż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.text
,ntext
iimage
. Oczywiście można również przechowywać duże typy w osobnej tabeli.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.
źródło