206

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

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

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

    WHERE COL1 LIKE '%search string%'

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

    WHERE CONTAINS (Col1, 'MyToken')

4

5 に答える 5

335

タイプはのVARCHAR(MAX)置き換えですTEXT。基本的な違いは、TEXT型は常にデータを BLOB に格納するのに対し、VARCHAR(MAX)型は 8k の制限を超えない限りデータを行に直接格納しようとし、その時点でデータを BLOB に格納することです。

LIKE 文の使用は、2 つのデータ型間で同じです。提供される追加機能は、他の列とVARCHAR(MAX)一緒に使用することもできるということです。ただし、大量のデータがある場合、これらの方法を使用するとパフォーマンスに大きな問題が発生します。=GROUP BYVARCHAR

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

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

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

于 2009-05-07T14:10:28.130 に答える
16

text から 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'

これにより、次のエラーが表示されます。

データ型textvarcharは、等値演算子では互換性がありません。

これはしません:

DECLARE @table TABLE (a varchar(max))

興味深いことに、LIKEまだ機能します。

WHERE a LIKE '%a%'
于 2009-05-07T14:00:06.877 に答える
12
  • Basic Definition

TEXT and VarChar(MAX) are non-Unicode large variable length character data type, which can store maximum of 2,147,483,647 non-Unicode characters (i.e. maximum storage capacity is: 2GB).

  • Which one to Use?

As per MSDN, Microsoft is suggesting to avoid using the TEXT datatype and it will be removed in a future version of SQL Server. VarChar(MAX) is the suggested data type for storing large string values instead of the TEXT data type.

  • In-Row or Out-of-Row Storage

TEXT型列のデータは、別の LOB データ ページの行外に格納されます。テーブル データ ページの行には、実際のデータが存在する LOB データ ページへの 16 バイトのポインタしかありません。タイプ列のデータは、VarChar(MAX)8000 バイト以下の場合、行内に格納されます。列の値VarChar(MAX)が 8000 バイトを超える場合、VarChar(MAX)列の値は別の LOB データ ページに格納され、行には、実際のデータが存在する LOB データ ページへの 16 バイトのポインターのみが含まれます。したがって、「行内」VarChar(MAX)は検索と取得に適しています。

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

一部の文字列関数、演算子、および構文は型列では機能しませんが、TEXT型列では機能しVarChar(MAX)ます。

  1. =VarChar(MAX)型列の等値演算子
  2. GROUP BYVarChar(MAX)タイプ列の句
  • システム IO に関する考慮事項

ご存知のように、VarChar(MAX)型列の値は、値の長さが 8000 バイトを超える場合、または行に十分なスペースがない場合にのみ、行外に格納されます。それ以外の場合は、行内に格納されます。そのため、列に格納されている値のほとんどVarChar(MAX)が大きく、行外に格納されている場合、データ取得の動作はTEXT型列とほとんど同じになります。

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

結論

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

ソース

于 2016-08-12T09:25:39.497 に答える
5

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

于 2013-09-16T20:45:04.087 に答える