web-dev-qa-db-ja.com

テーブルでVARCHAR(MAX)を使用することに不利な点はありますか?

これが私の苦境です。

基本的に、未知の長さの文字を保持するためにテーブルに列が必要です。しかし、SQL Serverで、次のような列にVARCHAR(MAX)またはNVARCHAR(MAX)を使用すると、パフォーマンスの問題が発生する可能性があるかどうかに興味がありました。 10文字を格納します。ただし、その列に最大数千文字、場合によっては100万文字になる可能性はわずかですが、予測できません。ただし、2GBの制限を超えないことは保証できます。

パフォーマンスの問題があるかどうか、または可能な場合はこの問題を解決するためのより良い方法があるかどうか、私はただ興味がありました。

30
Meiscooldude

Varchar(MAX)データ型を本来の目的で使用することを計画しているように思えます。

MAXデータ型のデータが8KBを超える場合、オーバーフローページが使用されます。 SQL Server 2005は、オーバーフローインジケーターをページに自動的に割り当て、他のデータ型を操作するのと同じ方法でデータ行を操作する方法を認識しています。

詳細については、Books Onlineをご覧ください: char and varchar

15
John Sansom

varchar(max)(およびnvarchar(max))列にインデックスを作成することはできません(ただし、それらを含めることはできます。ただし、2GBに達する可能性のある列をインデックスに含めるのは誰ですか?!)。この値で検索する場合は、フルテキストインデックスを使用しない限り、毎回スキャンを実行します。また、レポートデザイナーまたはプレゼンテーションデザイナー(Webまたはその他)は、誰かが百科事典をその列に入れてその周りをデザインする可能性があると想定する必要があることを忘れないでください。 「ユーザーはおそらくXを実行しないだろう」と聞くことほど悪いことはありません。ユーザーがそれを行うことができれば、彼らはそれを行います。ユーザーがトームを列に入れることができれば、ある時点でそうします。絶対にすべきでない場合は、IMOで、列サイズを適切なレベルに制限する方が理にかなっています。ユーザーが許可されている列にさらに詰め込もうとすると、その値をに入力する必要があるかどうかについての議論が生まれます。そもそもその列。

8
Thomas

私はいくつかの問題を見てきました-特にvarchar(MAX)を返し、その後再キャストされないスカラー関数(とにかく、これらは一般的に恐ろしいです)で。たとえば、特別な関数CleanString(somevarcharmax)がvarchar(max)を返し、varchar(50)で呼び出すが、CAST(CleanString(varchar10col)AS varchar(10))を呼び出さないとします-厄介なパフォーマンスの問題。

ただし、通常、テーブルにvarchar(max)列がある場合は、これらの種類の操作をまとめて実行するべきではないため、テーブルのデータニーズに適切に使用している場合は問題ありません。 。

3
Cade Roux

先日、 this の記事を見ました。これは、varchar(n)列に対するvarchar(max)のかなり小さなパフォーマンスラグを示しています。おそらくあなたに違いをもたらすには十分ではありません。ただし、そうであれば、別のテーブルを使用して、これらのいくつかの大きなテキストブロックを格納できます。小さなテキストをメインテーブルに残すこともできますが、フラグフィールドを追加して、新しいテーブルで大きなテキストを探すように指示することもできます。

3
Ray

Crystal Reports 12(および私が知る限り他のバージョン)はvarchar(max)を適切に処理せず、varchar(255)として解釈するため、レポート内のデータが切り捨てられます。

したがって、Crystal Reportsを使用している場合、それはvarchar(max)の欠点です。または、正確には、Crystalを使用することのデメリット。

見る:
http://www.crystalreportsbook.com/Forum/forum_posts.asp?TID=5843&PID=175
http://michaeltbeeitprof.blogspot.com/2010/05/crystal-xi-and-varcharmax-aka-memo.html

0
codeulike