SQL Serverでのvarchar(MAX)とTEXTの使用
-
08-07-2019 - |
質問
VARCHAR(MAX)
データ型(2GB近くのcharデータを格納できる)が、SQL Server 2005の TEXT
データ型の推奨される代替であると読みましたおよび次のSQL SERVERバージョン。
列内で文字列を検索する場合、どの操作が高速ですか?
-
VARCHAR(MAX)
列に対してLIKE
句を使用していますか?COL1のような '%search string%'
-
TEXT
列を使用して、この列に全文索引 / カタログを配置し、> CONTAINS
句?どこに含まれるか(Col1、「MyToken」)
解決
VARCHAR(MAX)
タイプは、 TEXT
の代わりになります。基本的な違いは、 TEXT
型は常にblobにデータを保存するのに対し、 VARCHAR(MAX)
型はデータがそれを超えない限り直接行に保存しようとすることです。 8kの制限があり、その時点でそれをblobに保存します。
LIKEステートメントの使用は、2つのデータ型間で同一です。追加機能 VARCHAR(MAX)
は、他の VARCHARと同様に
列は可能です。ただし、大量のデータがある場合、これらの方法を使用するとパフォーマンスに大きな問題が発生します。 =
および GROUP BY
でも使用できることを提供します。
検索に LIKE
を使用する必要がある場合、またはフルテキストインデックス作成および CONTAINS
を使用する必要がある場合。この質問は、 VARCHAR(MAX)
または TEXT
に関係なく同じです。
大量のテキストを検索し、パフォーマンスが重要な場合は、フルテキストインデックスを使用する必要があります。
LIKE
は実装が簡単で、多くの場合少量のデータに適していますが、インデックスを使用できないため、大規模なデータではパフォーマンスが極端に低下します。
他のヒント
大きなテキストの場合、全文インデックスはずっと高速です。ただし、フルテキストインデックス varchar(max)
も使用できます。
テキストからvarcharに変換せずにテキストフィールドを検索することはできません。
declare @table table (a text)
insert into @table values ('a')
insert into @table values ('a')
insert into @table values ('b')
insert into @table values ('c')
insert into @table values ('d')
select *
from @table
where a ='a'
これはエラーになります:
The data types text and varchar are incompatible in the equal to operator.
これはそうではありません:
declare @table table (a varchar(max))
興味深いことに、 LIKE
は引き続き機能します。つまり、
where a like '%a%'
- 基本定義
TEXT
および VarChar(MAX)
は、非Unicodeの大きな可変長文字データ型であり、最大2147483647の非Unicode文字を格納できます(つまり、最大格納容量は:2GB)。
- どちらを使用しますか
MSDNリンクによると、Microsoftは、テキストデータ型。これは、SQL Serverの将来のバージョンで削除される予定です。 Varchar(Max)は、Textデータ型ではなく、大きな文字列値を格納するための推奨データ型です。
- 行内または行外のストレージ
Text
型の列のデータは、独立したLOBデータページに行外に格納されます。テーブルデータページの行には、実際のデータが存在するLOBデータページへの16バイトポインターしかありません。一方、 Varchar(max)
タイプの列のデータは、8000バイト以下の場合、行に格納されます。 Varchar(max)列の値が8000バイトを超える場合、Varchar(max)列の値は別のLOBデータページに格納され、行には実際のデータが存在するLOBデータページへの16バイトポインターのみが含まれます。したがって、 In-Row
Varchar(Max)は検索と取得に適しています。
- サポートされている/サポートされていない機能
文字列関数、演算子、またはテキスト型の列では機能しないが、VarChar(Max)型の列では機能する一部の文字列関数。
-
=
VarChar(Max)型の列の演算子と等しい -
VarChar(Max)型列の句によるグループ化
- システムIOに関する考慮事項
VarChar(Max)型の列値は、格納される値の長さが8000バイトを超える場合、または行に十分なスペースがない場合にのみ、行外に格納されることがわかっているため、行に格納します。そのため、VarChar(Max)列に格納されている値の大部分が大きく、行外に格納されている場合、データ取得の動作はテキストタイプの列の動作とほぼ同じになります。
ただし、VarChar(Max)型の列に格納されている値のほとんどが、行に格納できるほど小さい場合。次に、LOB列が含まれていないデータを取得するには、LOB列の値が非LOB列の値が格納されているのと同じデータページにインラインで格納されるため、読み込むデータページの数が増えます。ただし、選択クエリにLOB列が含まれている場合、データ取得のための読み取りに必要なページ数は、テキストタイプの列と比較して少なくなります。
結論
良好なパフォーマンスを得るには、 TEXT
ではなく VarChar(MAX)
データ型を使用します。
MS Access (特に2003などの古いバージョン)を使用している場合、MS Accessは nvarchar(MAX )
はAccessのメモフィールドとして、 TEXT
はメモフィールドとして認識されます。