質問

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

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

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

    COL1のような '%search string%'

  2. 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)型の列では機能する一部の文字列関数。

  1. = VarChar(Max)型の列の演算子と等しい
  2. 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 はメモフィールドとして認識されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top