Les champs «hors ligne» sont-ils lus lorsqu'un index cluster est utilisé?

10

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:

  1. Chaque champ est-il stocké out of the rowou uniquement maxceux?
  2. Si vous utilisez la clustered indextable 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 ...

gotqn
la source
2
D'où vient ce dernier morceau cité? Ce n'est pas correct.
Paul White 9
3
Le texte intégral dans le fil MSDN d'origine (par Jacob Sebastian) est correct. La "citation" Stack Overflow en perd un peu. La petite fraction de celle que vous avez citée ci-dessus omet tous les bits importants :)
Paul White 9

Réponses:

13

Je sais que lorsque des VARCHAR(MAX)/NVARCHAR(MAX)colonnes sont utilisées, les données sont stockées hors de la ligne ...

En fait, cela dépend du réglage de l' large value types out of rowoption, qui peut être définie à l'aide de sp_tableoption. De la documentation :

Extrait de BOL

La valeur par défaut est pour les MAXvaleurs à stocker en ligne , jusqu'à 8000 octets, si elles correspondent. Sauf si vous avez utilisé sp_tableoptionpour modifier la valeur par défaut, vos MAXdonnées seront très probablement stockées en ligne.

Cela dit, il est peu judicieux d'utiliser MAXdes 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 de MAXtypes, car SQL Server doit être prêt à gérer des données pouvant atteindre 2 Go.

Chaque champ est-il stocké hors de la ligne ou uniquement le nombre maximal?

Seulement MAXceux - là. En outre, si une MAXcolonne 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 la LOBstructure hors ligne . Il existe également des circonstances dans lesquelles des colonnes non MAX peuvent être déplacées hors ligne.

Si vous utilisez l'index cluster de la table pour lire l'intégralité de l'enregistrement, les champs stockés hors de la ligne sont-ils également lus?

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.

Paul White 9
la source
Est-ce toujours vrai - Scanning the clustered index traverses only in-row data.? Par exemple, si vous souhaitez afficher les NVARCHAR(MAX)valeurs des champs, comment est-il possible de travailler uniquement avec les in-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 pas workavec le NVARCHAR(MAX)champ, SQL Server est assez intelligent pour le voir et ignorer la recherche de out-of-rowdonnées?
gotqn
Merci d'avoir répondu. Donc, enfin, si vous avez deux colonnes - intet nvarchar(max)que vous ne sélectionnez que la intcolonne, le serveur SQL ne gaspille pas de ressources pour readles out-of-rowdonnées car il sait que vous n'allez pas l'utiliser?
gotqn
Merci beaucoup. C'est très gentil. Il semble qu'en utilisant le, sp_tableoptionvous 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.
gotqn
3
@gotqn Oui. Hors ligne était la valeur par défaut pour les anciens types de LOB text, ntextet image. Vous pouvez également stocker les grands types dans une table séparée, bien sûr.
Paul White 9
4

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.

RLF
la source
Merci, je ne savais vraiment pas que vous pouviez contrôler cela.
gotqn