クラスタ化インデックスが使用されている場合、「行外」フィールドは読み取られますか?


10

VARCHAR(MAX)/NVARCHAR(MAX)列を使用するとデータが格納されることを知っています。out of the rowデータ行には、「大きな値」が格納されている別の場所へのポインターがあります。

次の質問があります。

  1. 各フィールドは格納されout of the rowていmaxますか、それとも1つだけですか?
  2. clustered indexレコード全体を読み取るためにテーブルのを使用している場合、行から格納されているフィールドも読み取られますか?

VARCHAR(MAX)またはNVARCHAR(MAX)は「大きな値の型」と見なされます。大きな値型は通常「行外」に格納されます。つまり...


2
最後に引用されたビットはどこから来たのですか?不正解です。
ポールホワイト9


3
(Jacob Sebastianによる)元のMSDNスレッドの全文が正しいです。スタックオーバーフローの「引用」は、かなりの部分を失います。上記で引用したほんの一部では、すべての重要なビットが省略されています:)
ポールホワイト9

回答:


13

VARCHAR(MAX)/NVARCHAR(MAX)列が使用される場合、データは行外に格納されることを知っています...

実際には、を使用して設定large value types out of rowできるオプションの設定によって異なりますsp_tableoptionドキュメントから:

BOLエキス

デフォルトでは、のためにあるMAXの値を保存するには、行、彼らが収まる場合は、8000のバイトまで、。sp_tableoptionデフォルトの変更に使用していない限り、MAXデータはおそらく行内に格納されます。

とはいえ、MAX8000バイトを超えない値のデータ型を使用することはお勧めできません。代わりに非MAX型を使用してください。MAXSQL Serverは最大2GBのサイズのデータ​​を処理できるように準備する必要があるため、他のものとは別に、型を処理するときのパフォーマンスはしばしば著しく低下します。

各フィールドは行外に格納されていますか、それとも最大のものだけですか?

MAXものだけ。さらに、以前に行内にあったMAX列が行外に移動された場合、その行のその列のみが影響を受けます。それは、行外のLOB構造へのポインターによって行内で置き換えられます。MAX以外の列が行外に移動される場合もあります。

レコード全体を読み取るためにテーブルのクラスター化インデックスを使用している場合、行から格納されているフィールドも読み取られますか?

クラスタ化インデックスのスキャンは、行内データのみを走査します。クエリに行外データが必要な場合は、行内ポインタを使用して検索されます。


これは常に本当Scanning the clustered index traverses only in-row data.ですか?たとえば、NVARCHAR(MAX)フィールド値を表示したい場合、どうすればin-row-data(値が行外に格納されている場合)でのみ操作できますか?または、クラスタ化インデックスを使用している(カバリングインデックスがないため)がworkNVARCHAR(MAX)フィールドを使用しない場合、SQL Serverはそれを確認してout-of-rowデータのルックアップをスキップするのに十分なほど賢いですか?
gotqn 2015年

答えてくれてありがとう。あなたは2つの列を持っているのであれば、最終的には、 - intそしてnvarchar(max)、あなたが唯一の選択しているint列を、SQL-Serverはにリソースを無駄にしない、それはあなたがそれを使用するつもりはない知っているように、データ?readout-of-row
gotqn 2015年

どうもありがとう。とてもいいです。使用していることを、そうですsp_tableoptionあなたは、多くの場合、クラスタ化インデックスの多くが求めているとき、行のサイズを小さくするために使用されていないテーブルのすべての出すことができます/スキャンが行われています。
gotqn 2015年

3
@gotqnはい。オフ行の古いLOB型のデフォルトだったtextntextimage。もちろん、大きな型を別のテーブルに格納することもできます。
ポールホワイト9

4

ラージオブジェクトストレージのこの動作は、テーブル設定によって制御できます。

exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>

SQL Server 2012ドキュメントのリファレンスは次の場所にあります:http : //msdn.microsoft.com/en-us/library/ms173530.aspx

したがって、スペースが使用される場所、行内または行外に格納される場所を制御できます。


ありがとう、私はあなたがこれを制御できることを本当に知りませんでした。
gotqn 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.