Werden "out of the row" -Felder gelesen, wenn ein Clustered-Index verwendet wird?


10

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:

  1. Ist jedes Feld gespeichert out of the rowoder nur das max?
  2. Wenn Sie clustered indexdie 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 ...


2
Woher kommt das zuletzt zitierte Stück? Es ist nicht richtig.
Paul White 9


3
Der vollständige Text im ursprünglichen MSDN-Thread (von Jacob Sebastian) ist korrekt. Das "Zitat" des Stapelüberlaufs verliert einiges davon. Der kleine Bruchteil davon, den Sie oben zitiert haben, lässt alle wichtigen Teile weg :)
Paul White 9

Antworten:


13

Ich weiß, dass bei Verwendung von VARCHAR(MAX)/NVARCHAR(MAX)Spalten die Daten außerhalb der Zeile gespeichert werden ...

Das hängt eigentlich von der Einstellung der large value types out of rowOption ab, die mit eingestellt werden kann sp_tableoption. Aus der Dokumentation :

BOL-Extrakt

Die Standardeinstellung ist für MAXWerte gespeichert werden , in-Reihe , bis zu 8000 Bytes, wenn sie passen. Sofern Sie sp_tableoptiondie Standardeinstellung nicht geändert haben, werden Ihre MAXDaten höchstwahrscheinlich in einer Reihe gespeichert.

Es ist jedoch eine schlechte Praxis, MAXDatentypen 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 mit MAXTypen häufig erheblich schlechter , da SQL Server auf Daten mit einer Größe von bis zu 2 GB vorbereitet sein muss.

Ist jedes Feld außerhalb der Zeile gespeichert oder nur das Maximum?

Nur die MAX. Wenn eine zuvor in der Zeile stehende MAXSpalte 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- LOBStruktur ersetzt. Es gibt auch Umstände, unter denen Nicht-MAX-Spalten aus der Zeile verschoben werden können.

Wenn Sie den Clustered-Index der Tabelle zum Lesen des gesamten Datensatzes verwenden, werden dann auch Felder gelesen, die außerhalb der Zeile gespeichert sind?

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.


Ist das immer wahr - Scanning the clustered index traverses only in-row data.? Wenn Sie beispielsweise die NVARCHAR(MAX)Feldwerte anzeigen möchten , wie ist es möglich, nur mit dem zu arbeiten in-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 nicht workmit dem NVARCHAR(MAX)Feld arbeiten, ist der SQL Server klug genug, dies zu erkennen und die Suche nach out-of-rowDaten zu überspringen ?
Gotqn

Danke für die Antwort. Wenn Sie also zwei Spalten haben - intund nvarchar(max)nur die intSpalte auswählen , verschwendet der SQL-Server keine Ressourcen für readdie out-of-rowDaten, da er weiß, dass Sie sie nicht verwenden werden?
Gotqn

Danke vielmals. Das ist sehr nett. Scheint, dass Sie mit dem sp_tableoptionin 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.
Gotqn

3
@gotqn Ja. Off-Reihe war der Standard für die alten LOB - Typen text, ntextund image. Sie können die großen Typen natürlich auch in einer separaten Tabelle speichern.
Paul White 9

4

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.


Danke, ich wusste wirklich nicht, dass Sie dies kontrollieren können.
Gotqn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.