2009-05-07 15 views
164

VARCHAR(MAX)データ型(2GBのcharデータを格納できる)は、SQL Server 2005および次世代SQL ServerバージョンのTEXTデータ型の推奨代替品です。SQL Serverでvarchar(MAX)とTEXTを使用する

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

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

    WHERE COL1 LIKE '%search string%'

  2. TEXT列を使用して、この列に本文インデックス/カタログを入れ、その後、CONTAINS句を使用して検索!大規模なテキストのために

    WHERE CONTAINS (Col1, 'MyToken')

+1

この投稿も便利です。http://stackoverflow.com/questions/564755/sql-server-text-type-vs-varchar-data-type – Jake

+21

その記事の中で最も重要な言及があります'TEXT'と' NTEXT'(と 'IMAGE')が廃止されていることを示す[MSDN documentation](http://msdn.microsoft.com/en-us/library/ms187993.aspx)へのリンクです。 – Brian

+0

リンクを見てください:http://stackoverflow.com/q/28980502/1805776 – vicky

答えて

271

VARCHAR(MAX)トンをypeはTEXTの代わりです。基本的な違いはTEXTタイプは常にブロブにデータを格納するのに対し、VARCHAR(MAX)タイプは8KBの制限を超えていなければそのデータを直接行に格納しようとし、その時点でブロブに格納するという点です。

LIKE文の使用は、2つのデータ型間で同じです。追加の機能VARCHAR(MAX)は、=GROUP BYと他のいずれかと同様に使用することができるということをあなたに教えてくれます。VARCHARただし、データが大量にある場合は、これらのメソッドを使用すると大きなパフォーマンス上の問題が発生します。あなたはのフルテキストインデックスCONTAINSを使用する必要がある場合は、または、検索するLIKEを使用するかどうかに関しては

。この質問はVARCHAR(MAX)またはTEXTに関係なく同じです。

大量のテキストを検索し、パフォーマンスが重要な場合は、フルテキストインデックスを使用する必要があります。

LIKEは、実装が簡単で、しばしば少量のデータに適していますが、インデックスを使用できないため大量のデータではパフォーマンスが非常に悪いです。

+10

私はそれが8kでページに格納され、ページが大きくなるとページの外に格納されることはわかりませんでした。とてもかっこいい。 – Brain2000

+3

最後の行が部分的に間違っています。ワイルドカードが検索対象の文字列の先頭にある場合にのみ、LIKEは索引を使用できません。 – SouravA

+0

データを持つ既存のテーブルからテキストのフィールドをvarchar(max)に変更することは問題ありませんか? – user1531040

17

フルテキストインデックスは速くくらいです。しかし、あなたはフルテキストインデックスvarchar(max)も同様にすることができます。

14

テキストフィールドをテキストから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. 

これにはないWheras:

declare @table table (a varchar(max)) 

興味深いことに、LIKEはまだ動作、すなわち

where a like '%a%' 
+9

+1ランダムdownvoteを言ってください!人々は私をdownvoteとコメントはありません、彼らは本当に人生を得る必要があるとき私は狂ったドライブ。 –

+2

彼がdownvotesを持っている理由は、**私がしなければならなかったことから覚えているものは、**技術的な質問に答えるときに持ってくる有効な議論ではありません。なぜ私たちが 'varchar(n)'や 'text'を使うべきなのかを突き止めようとする人々(私のようなもの)を考え、この答えを乗り越えてください。プロフェッショナルな環境では、あいまいな声明で主張すると問題を解決するのに役立つと思いますか? StackOverflowのすべてのポストは何千人もの人々に見られるように意図されており、結果として行動します! –

+2

@Zeratops笑、この回答は6歳です。私はそれを書いたとき、私はむしろ緑でした。私は言葉をきちんと説明するためにクリーンアップしました。 – DForck42

4

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

7
  • 基本定義

TEXTVarChar(MAX)は2147483647非Unicode文字(すなわち、最大の記憶容量である:2GB)の最大値を格納することができる非ユニコード大可変長文字データ型です。

  • どちらを使用しますか? MSDN link Microfost 1として

は、テキストデータ型の使用を避けるために示唆されており、それは、SQL Serverの将来のバージョンで削除されます。 Varchar(Max)は、テキストデータ型の代わりに大きな文字列値を格納するために推奨されるデータ型です。

  • において、行またはアウトオブ行ストレージText型カラムの

データは、別個のLOBデータ・ページ内のアウト行格納されています。表データ・ページの行には、実際のデータが存在するLOBデータ・ページへの16バイトのポインターしかありません。一方、Varchar(max)タイプのデータは、8000バイト以下の場合は行内に格納されます。 Varchar(max)列の値が8000バイトを超える場合、Varchar(max)列の値は別のLOBデータ・ページに格納され、行には実際のデータが存在するLOBデータ・ページへの16バイトのポインタのみが格納されます。だからIn-Row Varchar(Max)は検索と検索に適しています。

  • サポート/サポートされていない机能

文字列関数、演算子またはテキスト型の列では動作しませんコンストラクトのいくつかを、彼らはVARCHAR(最大)上で動作しない列を入力します。 VARCHAR(最大)に等しい演算子

  1. = VARCHAR(最大)の句を入力列ごとに
  2. グループを入力し

    • システムIOの考慮事項

VarChar(Max)型の列の値は次のとおりです。格納される値の長さが8000バイトより大きい場合、または行に十分なスペースがない場合にのみ行外に格納されます。それ以外の場合は、行内に格納されます。したがって、VarChar(Max)列に格納されている値の大部分が大きく、行外に格納されている場合、データ取得動作はText型列の動作とほぼ同じです。

しかし、VarChar(最大)型の列に格納されている値の大部分が、行内に格納できるほど小さい場合は、 LOB列が含まれていないデータを取り出すには、非LOB列の値が格納されている同じデータ・ページにLOB列の値が格納されているため、読み取るデータ・ページの数を増やす必要があります。ただし、選択クエリにLOB列が含まれている場合は、テキスト型の列と比較してデータの取得に必要なページ数が少なくて済みます。

結論

使用VarChar(MAX)データ型ではなく、良好なパフォーマンスを得るためTEXT

Source