Ich weiß, dass bei Verwendung von VARCHAR(MAX)/NVARCHAR(MAX)
Spalten die Daten gespeichert werden out of the row
- die Datenzeile hat einen Zeiger auf eine andere Stelle, an der der 'große Wert' gespeichert ist.
Ich habe folgende Fragen:
- Ist jedes Feld gespeichert
out of the row
oder nur dasmax
? - Wenn Sie
clustered index
die Tabelle zum Lesen des gesamten Datensatzes verwenden, werden auch Felder gelesen, die außerhalb der Zeile gespeichert sind?
VARCHAR (MAX) oder NVARCHAR (MAX) wird als "Typ mit großem Wert" betrachtet. Große Werttypen werden normalerweise "außerhalb der Zeile" gespeichert. Es bedeutet, dass die ...
Antworten:
Das hängt eigentlich von der Einstellung der
large value types out of row
Option ab, die mit eingestellt werden kannsp_tableoption
. Aus der Dokumentation :Die Standardeinstellung ist für
MAX
Werte gespeichert werden , in-Reihe , bis zu 8000 Bytes, wenn sie passen. Sofern Siesp_tableoption
die Standardeinstellung nicht geändert haben, werden IhreMAX
Daten höchstwahrscheinlich in einer Reihe gespeichert.Es ist jedoch eine schlechte Praxis,
MAX
Datentypen für Werte zu verwenden, die 8000 Byte niemals überschreiten. Verwenden Sie stattdessen einen Nicht-MAX-Typ. Abgesehen von allem anderen ist die Leistung beim Umgang mitMAX
Typen häufig erheblich schlechter , da SQL Server auf Daten mit einer Größe von bis zu 2 GB vorbereitet sein muss.Nur die
MAX
. Wenn eine zuvor in der Zeile stehendeMAX
Spalte aus der Zeile verschoben wird, ist außerdem nur die Spalte in dieser Zeile betroffen. Es wird in der Reihe durch einen Zeiger auf die Off-Row-LOB
Struktur ersetzt. Es gibt auch Umstände, unter denen Nicht-MAX-Spalten aus der Zeile verschoben werden können.Das Scannen des Clustered-Index durchläuft nur In-Row-Daten. Wenn für die Abfrage Daten außerhalb der Zeile benötigt werden, werden diese mit dem Zeiger in der Zeile nachgeschlagen.
quelle
Scanning the clustered index traverses only in-row data.
? Wenn Sie beispielsweise dieNVARCHAR(MAX)
Feldwerte anzeigen möchten , wie ist es möglich, nur mit dem zu arbeitenin-row-data
(wenn die Werte außerhalb der Zeile gespeichert sind)? Oder wenn Sie den Clustered-Index verwenden (weil es keinen abdeckenden Index gibt), aber nichtwork
mit demNVARCHAR(MAX)
Feld arbeiten, ist der SQL Server klug genug, dies zu erkennen und die Suche nachout-of-row
Daten zu überspringen ?int
undnvarchar(max)
nur dieint
Spalte auswählen , verschwendet der SQL-Server keine Ressourcen fürread
dieout-of-row
Daten, da er weiß, dass Sie sie nicht verwenden werden?sp_tableoption
in der Lage sind, alles aus der Tabelle zu entfernen, was nicht oft verwendet wird, um die Größe der Zeile zu reduzieren, wenn viele gruppierte Indexsuchen / -scans durchgeführt werden.text
,ntext
undimage
. Sie können die großen Typen natürlich auch in einer separaten Tabelle speichern.Dieses Verhalten für die Speicherung großer Objekte kann über die Tabelleneinstellung gesteuert werden:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
Die Referenz in der SQL Server 2012-Dokumentation finden Sie unter: http://msdn.microsoft.com/en-us/library/ms173530.aspx
Daher können Sie steuern, wo der Speicherplatz verwendet wird, in Reihe oder außerhalb der Reihe gespeichert.
quelle