2010-12-08 5 views
1

私はちょうどMaximum Capacity Specification for SQL Server 2008を読んで、行あたり最大8060バイトを見たのです?何が... 1行につき8KBしか許されないのですか? (はい、私は "行オーバーフローストレージ"特殊な取り扱い、私は標準的な動作について話している)を見たSQL Serverは最大8KB /行ですか?

私はここで何かを誤解しましたか?私は確信しているので、私はいくつかのMBサイズのSQL Serverデータベース内に格納されているバイナリオブジェクトを見たと確信している。この不吉な行ごと本当に1行、複数の列のようにテーブルの行を意味ですか?

だから私は3つのnvarcharの各4000文字がそこにあるとき(テキストボックスに書かれた3つの法的文書を仮定する...) - サーバーは警告を発する?

答えて

3

はい、あなたはあるの2Gb-1バイトを許可)、INSERTまたはUPDATE

LOB型(データ型はnvarchar(max)は、varchar型(最大)とvarbinary型(最大で、エラーをCREATE TABLEの上の警告を取得しますあなたは、データの大きなチャンクを保存し、あなたが前に見てきただろう何であると思いますか。単一のフィールド私はNVARCHAR(MAX)

  • を使用したい> 4000文字/ 8000バイトの場合

    • 1行で3 x nvarchar(4000)を使用しています。

      • 私のデザインは、1つまたは複数の列
      • 1のため
      • データ型はnvarchar(max)の間違っている: "少なくとも人口" の列
  • +1

    他のページにプッシュされる最大の列である必要はありませんが、自動的にそのように処理されると思います。制限を超えると、最大の列が別のページにプッシュされます。また、データが実際には8060バイトの制限を超えている場合にのみ、列サイズの合計がそうでない場合に注意してください。これが起こったときにスキーマを再考することは良い考えですが、SQL Serverがそれを処理できるようにすることはめったにありません。 OPの例では、各ドキュメントを別々に格納し、N個のドキュメントを格納するために結合テーブルを保持するほうがおそらく良いでしょう。 – tvanfosson

    +0

    これは私が思うSQL Server 2000の動作です(CREATE TABLEの警告、INSERTまたはUPDATEのエラー)。 SQL Server 2008はオーバーフローを処理します。 –

    +0

    @tvanfosson:sp_tableoptionの "行外の大きな値の型"オプションで構成することはできますが、基本的にサイレントで自動です。 @Martin:それについて忘れてしまった:SQL Server 2005で始まった。 – gbn

    1

    2008は、オーバーフローを処理するために1子テーブル2000年には、オーバーフローしたレコードを挿入することを単に拒否します。ただし、オーバーフローしたレコードの数が多いため、クエリでパフォーマンス上の問題が発生する可能性があるため、この点を考慮して設計することをお勧めします。あなたが説明したケースでは、ドキュメントタイプの列、ドキュメントの大きなフィールド、およびインタールテーブルへの外部キーを持つ関連テーブルを検討することがあります。しかし、3つの列すべてが同じレコードまたは最大値で満たされているのが不自然であれば、設計はうまくいくかもしれません。どのデータが最良かを判断するには、データを知る必要があります。別の考慮事項は、問題が発生してから別のドキュメントテーブルに置き換えられるまで、今のように続行することです。既存のテーブルの名前を変更して新しいテーブルを作成し、新しい構造からデータを引き出す既存のテーブル名を持つビューを作成することによっても、リファクタリングすることができます。これにより、挿入や更新のステートメントを調整する必要がありますが、多くのコードを壊さないようにすることができます。

    関連する問題