web-dev-qa-db-ja.com

SQL Serverでのvarchar(MAX)とTEXTの使用

VARCHAR(MAX)データ型(2GB近くのcharデータを格納できる)が、SQL Server 2005およびNext SQL SERVERバージョンのTEXTデータ型の推奨される代替品であることを読みました。

列内で文字列を検索したい場合、どの操作が高速ですか?

  1. VARCHAR(MAX)列に対してLIKE句を使用していますか?

    WHERE COL1 LIKE '%search string%'

  2. TEXT列を使用して、この列にフルテキストインデックス/Catalogを配置し、CONTAINS句を使用して検索しますか?

    WHERE CONTAINS (Col1, 'MyToken')

181
user85116

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は実装が簡単で、多くの場合、少量のデータに適していますが、インデックスを使用できないため、大きなデータではパフォーマンスが極端に低下します。

296
Robin Day

大きなテキストの場合、全文索引muchより高速です。ただし、フルテキストインデックスvarchar(max)asも使用できます。

17
Joel Coehoorn

テキストから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%'
15
DForck42
  • 基本的な定義

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)タイプの列では機能します。

  1. = VarChar(Max)型の列の演算子と等しい
  2. VarChar(Max)タイプ列の句によるグループ化

    • システムIO考慮事項

VarChar(Max)型の列の値は、格納される値の長さが8000バイトを超える場合、または行に十分なスペースがない場合にのみ行外に格納されることがわかっているため、そうでない場合は格納されます並んでいます。そのため、VarChar(Max)列に格納されている値の大部分が大きく、行外に格納されている場合、データ取得の動作はテキストタイプの列の動作とほぼ同様になります。

ただし、VarChar(Max)型の列に格納されている値のほとんどが、行に格納できるほど小さい場合。次に、LOB列が含まれていないデータを取得するには、LOB列の値が非LOB列の値が格納されているのと同じデータページにインラインで格納されるため、読み込むデータページの数が増えます。ただし、選択クエリにLOB列が含まれている場合、データ取得のために読み取る必要があるページ数は、テキストタイプの列に比べて少なくなります。

結論

良好なパフォーマンスを得るには、TEXTではなくVarChar(MAX)データ型を使用します。

ソース

8
Somnath Muluk

MS Access(特に2003年のような古いバージョン)を使用する場合、MS Accessはnvarchar(MAX)をAccessのメモフィールドとして認識しないのに対し、TEXTはメモとして認識されるため、SQL ServerでTEXTデータ型を使用する必要があります。フィールド。

4