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


195

VARCHAR(MAX)データ型(2GBに近いcharデータを格納できる)は、TEXTSQL Server 2005およびNext SQL SERVERバージョンでのデータ型の推奨代替品であると私は読んだだけです。

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

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

    WHERE COL1 LIKE '%search string%'

  2. TEXT列を使用して、この列に全文索引 / カタログを配置し、CONTAINS句を使用して検索しますか?

    WHERE CONTAINS (Col1, 'MyToken')


1
この投稿はも便利です:stackoverflow.com/questions/564755/...
ジェイク

24
その投稿で最も重要な言及は、それと(および)が非推奨であることTEXTを示すMSDNドキュメントへのリンクです。NTEXTIMAGE
ブライアン、

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

回答:


315

VARCHAR(MAX)タイプはのための代替品ですTEXT。基本的な違いは、TEXT型は常にデータをBLOBに格納するのに対し、VARCHAR(MAX)に格納するの、8kの制限を超えてに格納しない限り型は行に直接データを格納しようとすることです。

LIKEステートメントの使用は、2つのデータ型で同じです。追加の機能VARCHAR(MAX)により、他の列=GROUP BY同じように使用VARCHARできます。ただし、大量のデータがある場合、これらの方法を使用するとパフォーマンスに大きな問題が発生します。

LIKE検索に使用する必要があるかどうか、または全文索引付けとを使用する必要があるかどうかについてCONTAINS。この質問は、VARCHAR(MAX)またはに関係なく同じですTEXTです。

大量のテキストを検索していて、パフォーマンスが重要な場合は、全文索引を使用する必要があります

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


12
8kでページに格納され、それよりも大きい場合はページ外に格納されることを知りませんでした。とてもかっこいい。
Brain2000

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

1
データのある既存のテーブルのフィールドをテキストからvarchar(max)に変更しても問題ありませんか?
user1531040 2017


16

テキストから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%'

11
ランダムに反対票を投じるだけの+1!人々が私に反対票を投じ、コメントがない場合、私は夢中になります。彼らは本当に人生を送る必要があります。
Tom Stickel

3
彼が反対票を投じた理由は、私がしなければならなかったことから私が覚えていることから、技術的な質問に答えるときにもたらす有効な議論ではないからです。私varchar(n)や今のような人々が、なぜやを使うべきなのか考えてtext、この答えを乗り越えようとしている人について考えてみてください。専門的な環境では、漠然とした発言で議論することが問題の解決に役立つと思いますか?StackOverflowに関するすべての投稿は、何千人もの人々が見ることを意図しており、結果として行動します!
Anwar、2015年

3
@Zeratops笑、この答えは6歳です。私が書いたときは、かなり環境に優しかったです。私は言葉を一段と整理して、もっと要点を明確にしました。
DForck42 2015年

9
  • 基本的な定義

TEXTおよびVarChar(MAX)非Unicodeの大きな可変長文字データ型で、最大2147483647非Unicode文字を格納できます(つまり、最大ストレージ容量は2GBです)。

  • どちらを使用しますか?

MSDNリンクのとおり、MicrosoftはTextデータ型の使用を避けることを提案しており、SQL Serverの将来のバージョンでは削除される予定です。Varchar(Max)は、テキストデータ型ではなく、大きな文字列値を格納するための推奨データ型です。

  • 行内または行外ストレージ

Textタイプ列のデータは、行外の別のLOBデータページに格納されます。テーブルデータページの行には、実際のデータが存在するLOBデータページへの16バイトポインターしかありません。一方、Varchar(max)タイプ列のデータは、8000バイト以下の場合、行内に格納されます。Varchar(max)列の値が8000バイトを超える場合、Varchar(max)列の値は個別のLOBデータページに格納され、行には実際のデータが存在するLOBデータページへの16バイトポインターしかありません。したがって、In-RowVarchar(Max)は検索と取得に適しています。

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

一部の文字列関数、演算子、または構造は、テキストタイプの列では機能しませんが、VarChar(Max)タイプの列では機能します。

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

    • システムIOに関する考慮事項

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

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

結論

パフォーマンスを向上させるためVarChar(MAX)ではなく、データ型を使用してくださいTEXT

ソース


5

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.