• ベストアンサー

SQLServer2008での1レコードバイト数の上限を増やしたい

こんにちは、いつも参考にさせていただいております。 通常1レコードのバイト数の上限は8060ですが、 それがSQLServer2008あたりから緩和されたと聞きました。 そこでマイクロソフトのTechNetを見ましたがよくわかりませんでした。 2つわからない点がありますのでご教授どうかお願いいたします。 ◆疑問点(1)◆ ↓で8060バイト上限が緩和できそうだと思った中での疑問です。 マイクロソフトのTechNet 「8 KB を超える場合の行オーバーフロー データ」 http://msdn.microsoft.com/ja-jp/library/ms186981.aspx 「これら(varchar 型、nvarchar 型、varbinary 型、sql_variant 型、またはCLR ユーザー定義型)の列の長さは、単独の場合は引き続き 8,000 バイトに制限されますが、組み合わせた場合は 8,060 バイトの制限を超えることができます。」 わからないのは、上記文章中にある「組み合わせた場合」というポイントです。 ○varchar 型とnvarchar 型、varbinary 型とsql_variant 型というように違う種類を組み合わせなければ8060バイト制限が越えられないのでしょうか? ◆疑問点(2)◆ 「8 KB を超える場合の行オーバーフロー データ」ページ内でntext型などについての注意書きがありました(下記)。 それについての疑問です。 「この制限は、varchar(max) 型、nvarchar(max) 型、varbinary(max) 型、ntext 型、text 型、image 型、または xml 型の列には適用されません。」 ○ntext型とvarchar 型等との組み合わせの場合、8060バイト制限は関係ないのでしょうか?  (というよりntext型などは8060バイトレコード上限が関係ない?) 「text 型データと image 型データの使用」 http://msdn.microsoft.com/ja-jp/library/ms189574.aspx どうかご教授・ヒントなどいただけないでしょうか。 よろしくお願いいたします。 補足など必要でしたらコメントください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

#2です。 >おっしゃっていることをまとめてみたのですが↓であっていますでしょうか? >・新設されたvarchar(max) 型などのLOBは1列ごとに16バイト、1行で最大500バイトまでのポインタを保持する >・従来のままの型で1行で8Kを超える場合1行全体で24バイトのポインタを保持する ・新設されたvarchar(max) 型などのLOBは1列ごとに16バイトのポインタを保持するが、先頭部分をデータエリア内に保持するというオプションを指定すると、最大500バイトまでの部分は8Kのデータページに保持される ・従来のままの型で1行で8Kを超える場合、超えたとSQL Serverが判断した時点で超えた列について、1列につき24バイトのポインタを保持させ、超えた部分を行オーバフローページに押し出す ということかと思います。 この辺は「Inside SQL Server 2005 ストレージエンジン編」という本にくわしく書かれていますよ。

yuripppe
質問者

お礼

jamshid6さん、ご回答ありがとう御座います。 > ・新設されたvarchar(max) 型などのLOBは1列ごとに16バイトのポインタを保持するが、先頭部分をデータエリア内に保持するというオプションを指定すると、最大500バイトまでの部分は8Kのデータページに保持される > ・従来のままの型で1行で8Kを超える場合、超えたとSQL Serverが判断した時点で超えた列について、1列につき24バイトのポインタを保持させ、超えた部分を行オーバフローページに押し出す そういう仕組みなんですね。 言葉を言い換えて頂いたのでよくわかりました。 本当にありがとうございます。 > この辺は「Inside SQL Server 2005 ストレージエンジン編」という本にくわしく書かれていますよ。 早速読んでみたいと思います。 とても勉強になりました。ありがとうございました。

その他の回答 (3)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

私なりの解釈まとめ。 ・溢れた分は、"他所"に保管します(その際、24バイト分の"他所"の場所情報を保存) ・varchar(max)等は最初から"他所"として、16バイト分の場所情報だけを保存します ・"他所"の場所情報込みで、1レコード8KBまでですよ。 ってトコでしょうか。

yuripppe
質問者

お礼

kuroizellさん、ご回答ありがとう御座います。 > ・溢れた分は、"他所"に保管します(その際、24バイト分の"他所"の場所情報を保存) > ・varchar(max)等は最初から"他所"として、16バイト分の場所情報だけを保存します > ・"他所"の場所情報込みで、1レコード8KBまでですよ。 整理していただきありがとうございます。 だいぶ混乱していたようです。 色々と勘違いばかりしていましたが、ようやくわかってきました。 とても助かりました。ありがとうございました。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

SQL Server 2005以降の変更ですが、別にデータページのサイズが変わったわけではなく、従来と同じ8Kのままです。ただ、複数のフィールドの合計が8Kを超えた場合は行オーバーフローページにあふれたものを収録することができるようになったので、結果として8Kを超えるサイズのテーブルを作成できるようになったということです(オーバーフローした場合は24バイト分のポインタを8K内に保持します)。 「組み合わせた場合」というのは「データ型を組み合わせた場合」という意味ではありません。別にvarcharだけを組み合わせてもいいです。 SQL Server 2005で新設されたMAXがつく型は、そもそもLOB(ラージオブジェクト)ですので、8K内には16バイトのポインタしか保持しません。 (設定により500バイトまでは8K内に保持することができますが) したがって、上記のサイズの対象外になります。 行オーバーフローにせよ、ラージオブジェクトにせよ、ポインタを保持して別のデータページにデータを保管しているわけですから、当然パフォーマンスには多少影響があることになります。また、ポインタとはいえ16ないし24バイトの領域を必要としますので、オーバーフローする列が多くなれば当然8Kのデータページ内の領域は食います。したがって、オーバーフローできる列数は無制限ではありません。

yuripppe
質問者

補足

jamshid6さん、ご回答ありがとう御座います。 >オーバーフローした場合は24バイト分のポインタを8K内に保持します ここがどうなるかがよくわかっていませんでした。 そういう仕組みになっていたのですね、ご説明ありがとうございます。 >「組み合わせた場合」というのは「データ型を組み合わせた場合」という意味ではありません。別にvarcharだけを組み合わせてもいいです。 ありがとうございます。 > SQL Server 2005で新設されたMAXがつく型は、そもそもLOB(ラージオブジェクト)ですので、8K内には16バイトのポインタしか保持しません。 > (設定により500バイトまでは8K内に保持することができますが) > したがって、上記のサイズの対象外になります。 なるほど、ありがとうございます。 とするとお時間が許すならもう1つヒントをいただけないでしょうか。 おっしゃっていることをまとめてみたのですが↓であっていますでしょうか? ・新設されたvarchar(max) 型などのLOBは1列ごとに16バイト、1行で最大500バイトまでのポインタを保持する ・従来のままの型で1行で8Kを超える場合1行全体で24バイトのポインタを保持する どうかよろしくお願いいたします。

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.1

MS SQLserverは触ったことないので、よく分かりませんが >「組み合わせた場合」 MSのサイト見ましたが、「1レコードあたりのデータ量は8060バイト制限ですが、varchar等を含む場合は別で、1カラムあたりは相変わらず8000バイト制限だけど、1レコード合計ではもっといけるようになりましたよ。」という風な意味に読めました。 MSのサイトの意味不明さには毎度閉口します。 >「この制限は、varchar(max) 型、nvarchar(max) 型、varbinary(max) 型、ntext 型、text 型、image 型、または xml 型の列には適用されません。」 > varchar [ ( n | max ) ] > max は、記憶領域のサイズが 2^31-1 バイトであることを示しています。 http://msdn.microsoft.com/ja-jp/library/ms176089.aspx varchar(max)っていうのが新しく出来て、「8000バイト超えるならそっち使って下さい、varchar(8000)とかとは別ルールですよ(この制限(中略)適用されません)」という風な意味でしょうか。

yuripppe
質問者

補足

kuroizellさん、ご回答ありがとう御座います。 > MS SQLserverは触ったことないので、よく分かりませんが > >「組み合わせた場合」 > MSのサイト見ましたが、「1レコードあたりのデータ量は8060バイト制限ですが、varchar等を含む場合は別で、1カラムあたりは相変わらず8000バイト制限だけど、1レコード合計ではもっといけるようになりましたよ。」という風な意味に読めました。 > MSのサイトの意味不明さには毎度閉口します。 たしかに、そう読むとあの文章もしっくりしてきました。 わかりやすく説明していただきありがとうございます。 > >「この制限は、varchar(max) 型、nvarchar(max) 型、varbinary(max) 型、ntext 型、text 型、image 型、または xml 型の列には適用されません。」 > > varchar [ ( n | max ) ] > > max は、記憶領域のサイズが 2^31-1 バイトであることを示しています。 > ?http://msdn.microsoft.com/ja-jp/library/ms176089.aspx? > varchar(max)っていうのが新しく出来て、「8000バイト超えるならそっち使って下さい、varchar(8000)とかとは別ルールですよ(この制限(中略)適用されません)」という風な意味でしょうか。 なるほどです。リンクもありがとうございます。 内容をそのまま、まとめると ・varchar(max)は1カラムで8000バイト超えるときに使う ・varchar(max)が使われる行のバイト数上限は、varchar(max)バイト数を含めない8060バイトとなる というような感じでしょうか。 もしお時間があれば上記の内容について、ご指摘などいただけるとありがたいです。 私もSQLServerはほとんど触っていないので、文面からのヒントだけでも非常に助かりました。

関連するQ&A

  • SQL Serverでの文字列の格納

    SQL Serverで日本語の文字列を格納する型について質問させてください。 日本語文字列の格納にはnvarcharとntext型がありますが、全部 ntext型にしてもよいものでしょうか? 全部ntext型にした場合、何か都合の悪いことがあるのでしょうか?

  • 文字型について

    文字データについて教えて頂きたいです。 (1)nvarchar と varchar を文字結合したとき、何か問題が起きることもあるのでしょうか? (2)bcpコマンドでfmtファイルを使用してCSVデータを取り込むとき、 テーブル側はnvarchar(4000)にしているにも関わらず、510バイトまでしか取り込めないようなのです。そういう仕様なのでしょうか?

  • 文字数とバイト数が違うのは

    体験版の送信ソフトで送れるプログラムは1KBまでという制限があります。 送ろうと思っているNCデータのサイズをプロパティで確認してみると  NCデータの文字数は184なのに サイズが270バイトとなっています。 これはスペースも一文字としてカウントされるからなのでしょうか? またディスク上のサイズでは32768バイト(32KB)となっています。 ディスク上のサイズとは何で またなぜ大きくなるのか教えて頂けませんか? またこの場合ソフトの制限の1KBまでというのは サイズでみるのかディスク上のサイズで見るのかを 教えて頂けませんか? お願いします。

  • sp_executesqlを実行してもテーブルコピーができない。

    次の様な動的SQLを作成し、テーブルのコピーを作成しようとしていますが「メッセージ 214、レベル 16、状態 2、プロシージャ sp_executesql、行 1 プロシージャにはデータ型 'ntext/nchar/nvarchar' のパラメータ '@statement' が必要です。」というエラーが出て実行できません。 構文などは間違っていないと思うのですが、よろしくご教授下さい。 ■プログラム DECLARE @SQLString VARCHAR(500) DECLARE @ParmDefinition VARCHAR(500) DECLARE @spRet int set @SQLString= N'SELECT * INTO @tableto FROM @tablefrom' set @ParmDefinition= N'@tableto VARCHAR(100),@tableto VARCHAR(100)' EXECUTE @spret=sp_executesql @SQLString,@ParmDefinition,@tableto='コピー元のテーブル名',@tableto='コピー先のテーブル名'

  • 列名の最大文字数は?(MS SQL Server)

    こんにちは、いつも参考にさせていただいております。 今Microcoft SQL Server2008のためのDB設計を行っているのですが、 列名を設定する時点になって、文字数の制限があっただろうかと 立ち止まってしまいました。 Oracleは30Byteとか指定がありましたが、 MS SQL Serverでは公式文書ぐらいしか見つけられず これだ!というわかりやすい答えに出会えていません。 (公式文書…  http://msdn.microsoft.com/ja-jp/library/aa260295(SQL.80).aspx ) 公式文書の 「COLUMN_LENGTH」の横にある数字「128」があやしいな、と思っていますが型はvarcharなのでしょうか? それだと何文字ぐらい入るのでしょうか? とても初歩的という質問だとは思いますが、どうかご助言いただけないでしょうか。 よろしくお願いいたします。

  • Unicodeについて

    お世話になっております。 papillon68と申します。 [バージョン] SQLServer2005 (Management Studio Express 9.00.2047.00) 早速ではありますが、今回ご教授頂きたいことはSQLSERVERでのUnicodeの扱いについてです。 PHPとAjaxとSQLServerの連携を行っています。 ソース(PHPとAjax)はUTF-8で書いています。 ここで、SQLServerへのやりとりもUTF-8で行いたいのですが、どのようにしたらよいでしょうか。 文字列を扱う列の型は「nchar、nvarchar、ntext」などを使っています。 UTF-8でSQLServerに登録すると2バイト文字(ひらがな、漢字など)が 入力したとおりに保存されます。 ですが、SQLServerからデータをSELECT文で抜き出したときに 2バイト文字が化けてしまっています。 どのようにすれば文字化けせずにソースもSQLServerもUTF8で行うことができるのでしょうか。 お手数をお掛け致しますが、ご教授よろしくお願い致します。

  • T-SQL ユーザ定義関数 指定したバイト数までの文字列を返したい

    お世話になります。 SQLserver2005でユーザー定義関数に初めてトライしているのですが デバッグツールがなく、うまく動かない理由がわからず困っております。 ある文字列に対して、指定したバイト数までの文字を返すような関数を作りたいです。VBAでいうLEFT関数のバイト数指定版というのでしょうか。(すでにそんな関数があったりして。。) 以下のように作ってみたのですが、無限ループのようで、いつまでたってもデータが返ってきません。。どなたか教えていただけませんでしょうか? set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[LeftByte] (@value nvarchar,@maxbyte bigint) RETURNS nvarchar(max) AS BEGIN declare @Countvalue as bigint declare @byte as bigint declare @result as nvarchar select @byte = 0 select @Countvalue = 0 select @result = '' while @byte < @maxbyte begin select @Countvalue = (@Countvalue + 1) select @result = (left(@value,@Countvalue)) select @byte = (datalength(@result)) if @byte >= @maxbyte break else continue end RETURN @result END 宜しくお願い致します。

  • オーバーフローについて教えてください。

    複数のIT用語辞典で調べるとオーバーフローとはデータ型が扱える範囲の上限を超えてしまうこととありました。 とするとint型の場合 32,767を超えることはオーバーフローと言うのでしょうけど、–32,768を下回ることはなんと言うのでしょうか?

  • 上限値基準の工程能力指数算出について

    図面の基準値が公差の中央値狙いではなく上限値になってます。 その為実際の実測データも上限値寄りになってしまい、工程能力指数cpkの計算式に当てはめると、低い数値になってしまいます。 イメージ 基準値10.0 公差+0、-0.5 実測値max10.0、min9.8、平均9.93 実測は基準値付近になっているので状態はいいと思いますが、上記だと上限値10.0下限値9.5なので中央値9.75に対しては偏りがありcpkが低くなってしまいます。 設計者の意図はあくまで上限値狙いであり、製造側もそれに答えて上限値寄りに製作できているのですが、その工程能力を数字でどのように表せばいいのか困っております。 工程能力としては非常に高いと思っています。 もしかしたら片側規格と考えcpで算出すべきなのかもしれませんが、それだと10±0.25の設定だった場合より半分の実力値になるのでは?と疑問にも思っています。 アドバイス頂けると幸いです。

  • オラクルのデータ型について

    オラクルのデータ型について教えてください。 ものすごく基本的な質問かもしれませんが、今後のことを考えて質問させていただきます。 文字列の型の"CHAR"と"VARCHAR2"についてです。 "CHAR"は固定長で2000バイト、 "VARCHAR2"は可変長で4000バイトとマニュアル等には記載されていますが、 いまいちピンときません。 そこで、それぞれの長所、短所。どのような時にどちらを使用したらいいのか 等をなるべく詳しく教えてもらえないでしょうか? 宜しくおねがいします。