VARCHAR(MAX)
データ型(2GB近くのcharデータを格納できる)が、SQL Server 2005およびNext SQL SERVERバージョンのTEXT
データ型の推奨される代替品であることを読みました。
列内で文字列を検索したい場合、どの操作が高速ですか?
VARCHAR(MAX)
列に対してLIKE
句を使用していますか?
WHERE COL1 LIKE '%search string%'
TEXT
列を使用して、この列にフルテキストインデックス/Catalogを配置し、CONTAINS
句を使用して検索しますか?
WHERE CONTAINS (Col1, 'MyToken')
VARCHAR(MAX)
型は、TEXT
の代わりになります。基本的な違いは、TEXT
型は常にblobにデータを格納するのに対し、VARCHAR(MAX)
型は8kの制限を超えない限りデータを行に直接格納しようとし、その時点でblobに格納することです。
LIKEステートメントの使用は、2つのデータ型間で同一です。 VARCHAR(MAX)
が提供する追加機能は、他のVARCHAR
列と同様に、=
およびGROUP BY
でも使用できることです。ただし、大量のデータがある場合、これらの方法を使用するとパフォーマンスに大きな問題が発生します。
LIKE
を使用して検索する必要がある場合、またはFull Text IndexingおよびCONTAINS
を使用する必要がある場合について。この質問は、VARCHAR(MAX)
またはTEXT
に関係なく同じです。
大量のテキストを検索していて、パフォーマンスが重要な場合は、Full Text Indexを使用する必要があります。
LIKE
は実装が簡単で、多くの場合、少量のデータに適していますが、インデックスを使用できないため、大きなデータではパフォーマンスが極端に低下します。
大きなテキストの場合、全文索引はmuchより高速です。ただし、フルテキストインデックスvarchar(max)
asも使用できます。
テキストから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はTextデータ型の使用を避けることを提案しており、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)タイプ列の句によるグループ化
VarChar(Max)型の列の値は、格納される値の長さが8000バイトを超える場合、または行に十分なスペースがない場合にのみ行外に格納されることがわかっているため、そうでない場合は格納されます並んでいます。そのため、VarChar(Max)列に格納されている値の大部分が大きく、行外に格納されている場合、データ取得の動作はテキストタイプの列の動作とほぼ同様になります。
ただし、VarChar(Max)型の列に格納されている値のほとんどが、行に格納できるほど小さい場合。次に、LOB列が含まれていないデータを取得するには、LOB列の値が非LOB列の値が格納されているのと同じデータページにインラインで格納されるため、読み込むデータページの数が増えます。ただし、選択クエリにLOB列が含まれている場合、データ取得のために読み取る必要があるページ数は、テキストタイプの列に比べて少なくなります。
結論
良好なパフォーマンスを得るには、TEXT
ではなくVarChar(MAX)
データ型を使用します。
MS Access(特に2003年のような古いバージョン)を使用する場合、MS Accessはnvarchar(MAX)
をAccessのメモフィールドとして認識しないのに対し、TEXT
はメモとして認識されるため、SQL ServerでTEXT
データ型を使用する必要があります。フィールド。