Je sais que lorsque des VARCHAR(MAX)/NVARCHAR(MAX)
colonnes sont utilisées, les données sont stockées out of the row
- la ligne de données aura un pointeur vers un autre emplacement où la «grande valeur» est stockée.
J'ai les questions suivantes:
- Chaque champ est-il stocké
out of the row
ou uniquementmax
ceux? - Si vous utilisez la
clustered index
table pour lire la totalité de l'enregistrement, les champs stockés hors de la ligne sont-ils également lus?
VARCHAR (MAX) ou NVARCHAR (MAX) est considéré comme un «type de grande valeur». Les types de grande valeur sont généralement stockés «hors ligne». Cela signifie que le ...
Réponses:
En fait, cela dépend du réglage de l'
large value types out of row
option, qui peut être définie à l'aide desp_tableoption
. De la documentation :La valeur par défaut est pour les
MAX
valeurs à stocker en ligne , jusqu'à 8000 octets, si elles correspondent. Sauf si vous avez utilisésp_tableoption
pour modifier la valeur par défaut, vosMAX
données seront très probablement stockées en ligne.Cela dit, il est peu judicieux d'utiliser
MAX
des types de données pour des valeurs qui ne dépasseront jamais 8 000 octets - utilisez plutôt un type non MAX. En plus de toute autre chose, les performances sont souvent beaucoup plus faibles lorsqu'il s'agit deMAX
types, car SQL Server doit être prêt à gérer des données pouvant atteindre 2 Go.Seulement
MAX
ceux - là. En outre, si uneMAX
colonne précédemment en ligne est déplacée hors ligne, seule cette colonne de cette ligne est affectée. Il est remplacé en ligne par un pointeur sur laLOB
structure hors ligne . Il existe également des circonstances dans lesquelles des colonnes non MAX peuvent être déplacées hors ligne.L'analyse de l'index clusterisé ne traverse que les données en ligne. Si des données hors ligne sont nécessaires pour la requête, elles sont recherchées à l'aide du pointeur en ligne.
la source
Scanning the clustered index traverses only in-row data.
? Par exemple, si vous souhaitez afficher lesNVARCHAR(MAX)
valeurs des champs, comment est-il possible de travailler uniquement avec lesin-row-data
(si les valeurs sont stockées hors de la ligne)? Ou lorsque vous utilisez l'index cluster (car il n'y a pas d'index de couverture) mais que vous n'allez paswork
avec leNVARCHAR(MAX)
champ, SQL Server est assez intelligent pour le voir et ignorer la recherche deout-of-row
données?int
etnvarchar(max)
que vous ne sélectionnez que laint
colonne, le serveur SQL ne gaspille pas de ressources pourread
lesout-of-row
données car il sait que vous n'allez pas l'utiliser?sp_tableoption
vous pouvez mettre hors de la table tout ce qui n'est pas souvent utilisé afin de réduire la taille de la ligne, lorsque de nombreuses recherches / analyses d'index cluster sont effectuées.text
,ntext
etimage
. Vous pouvez également stocker les grands types dans une table séparée, bien sûr.Ce comportement pour le stockage d'objets volumineux peut être contrôlé par le paramètre de table:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
La référence dans la documentation de SQL Server 2012 se trouve à: http://msdn.microsoft.com/en-us/library/ms173530.aspx
Par conséquent, vous pouvez contrôler où l'espace est utilisé, en ligne ou stocké hors ligne.
la source