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 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 nie sp_tableoption
zmieniłeś ustawień domyślnych, Twoje MAX
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 przypadku MAX
typó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 MAX
te. Ponadto, jeśli MAX
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 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.