• ベストアンサー

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

jamshid6の回答

  • 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バイトのポインタを保持する どうかよろしくお願いいたします。

関連する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バイトとマニュアル等には記載されていますが、 いまいちピンときません。 そこで、それぞれの長所、短所。どのような時にどちらを使用したらいいのか 等をなるべく詳しく教えてもらえないでしょうか? 宜しくおねがいします。