質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • PostgreSQL

    992questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PostgreSQLのデータベース容量見積

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,952

mugichon

score 36

テーブルサイズが64590という大きなテーブルがあります。
上記はtext形式が存在するテーブルで、流石に1Gで試算するわけにもいかない
と思い、30000バイトとして試算しようと考えています。

そこで、テーブルの計算式に当てはめると、
行数:10000、fillfactor:100、行データ長:64590
[テーブルデータ量式]
8KB × ceil(行数 / floor(floor(8KB × fillfactor - 24) / (28 + 行データ長)))
=>8192 x ceil (10000 / floor( floor(8192 x 100 / 100 -24) / (28+64590)))

となりますが、行データ長が大きすぎるため、行数の前のfloorによって0となってしまいます。

8192 x ceil ( 10000 / 0 )
で0除算でエラーとなり、計算出来ませんでした。
このような場合、どうしたら良いのでしょうか?

上記計算式の出典は以下です。
https://lets.postgresql.jp/documents/tutorial/gihyo_rensai/5

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2017/09/05 14:16 編集

    この計算式が、TOASTテーブル( https://www.postgresql.jp/document/9.6/html/storage-toast.html )がある場合に対応していない気がしますが、この計算式の出典を記載していただけないでしょうか。

    キャンセル

  • mugichon

    2017/09/06 07:34

    ご回答頂き有難う御座います。出典を質問文に記載しました。

    キャンセル

回答 1

checkベストアンサー

+1

PostgreSQL は、1ページが、8192 バイトを超えれないので、大きなデータは、本来のテーブルとは別のTOASTテーブルに保存する仕様になっています。

TOASTを使っている場合のディスク容量の見積もり計算について、石井さんの書かれた記事に記載がありましたので、以下を参照してください。
Web+DB PRESS Vol.24 徒然PostgreSQL散策 第10回テーブルの構造とディスク容量の見積もり


(おまけ)
実際に計算してみようと思いつつ、カラム構成が不明であきらめたのですが、ためしに質問に記載された数字を使って、ざっくりと電卓をたたいてみました。
かなり大雑把な感じになりますが、インデックスを除いて、概算 700MB 位かなと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/06 07:58

    ご回答頂きありがとうございます。
    テーブル構造は以下の通りです。

    character varying 64
    character varying 1024
    character varying 64
    timestamp without time zone 8
    character varying 512
    character varying 512
    character varying 64
    character varying 64
    text 30000
    text 30000
    smallint 2
    smallint 2
    timestamp without time zone 8
    character varying 64
    bigint 8
    timestamp without time zone 8
    smallint 2
    timestamp without time zone 8
    character varying 64
    character varying 2048
    character varying 64

    TOASTの考え方がよくわかっていなくて恐縮ですが、8192バイトを超える
    場合には、元のデータは1994単位に分割され、OID(4バイト?)+Integer(2バイト)+1994
    つづ行に格納され、例えば10000バイトの場合には、
    (4+2+1994)*5+(4+2+30)=10036バイトになるという事でしょうか?
    また、8192バイトを超えない場合には、上記計算式で計算したものをTOASTの計算式
    と足せばよいものでしょうか?

    キャンセル

  • 2017/09/06 14:44

    https://www.postgresql.jp/document/9.6/html/storage-toast.html の記載では、可変長に対応しているデータ型のカラム毎に処理されるように読めます。

    今回の構成で、対象となるのは、TEXT 型カラム2個と character varying 2048 と思われますので、対象カラムがすべて TOAST 管理されると仮定した場合(対象カラムに設定値上限のデータ長のデータが入っていると仮定した場合)は、以下の計算になるのではないかと思います。

    本体テーブル
      1行あたり   28 (ヘッダ) + 2590 (データ) + 20 * 3 (TOAST管理のポインタ) = 2678
      ページ数換算  8168 / 2678 = 3
      容量      8192 * 10000 / 3 = 約 26 MB

    TOASTデータ
      1カラムあたり  30,000 / 1994 = 16 チャンク (TEXT型)
              2,048 / 1994 = 2 チャンク  (VARCHAR 2048)
      総チャンク数   ( 16 + 16 + 2 ) * 10000 = 340,000 (チャンク)
      チャンクをブロック換算  340,000 / 4 = 85,000 (ブロック)
      容量      8192 * 85,000 = 664 MB

    合計では 690 MB でしょうか。

    キャンセル

  • 2017/09/07 20:54

    詳細なご説明ありがとうございます!
    なるほど、、そのような計算になるんですね。。
    難しいですが、引用頂いたページを読み込んでみたいと思います!

    本当にありがとうございました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    DB設計について

    1画面に複数選択のチェックボックスを作成する際の DB設計について質問です。 例えば、10個のチェックボックスがある場合、 設計の仕方は色々あると思いますが、チェックボックスの

  • 解決済

    【PostgreSQL】結合テーブルにデータがない場合、レコードが抜け落ちる

    PostgreSQLを利用しています。  やりたいこと2つのテーブルを結合して、下記のようなデータを取りたいです。 name     | total_sales | prod

  • 解決済

    postgreSQLで変数を使用したい

    PostgreSQLにて、変数を使用したい 以下のSQL文を参照ください UPDATE時に代入している現在時刻と、INSERT時に代入している現在時刻を全く同じ値にしたいの

  • 受付中

    pg_restoreのオプションについて質問です。

    データベース内のaddressesテーブルをpg_dumpし、そのテーブルをpg_restoreしようと下記のコマンドを発行しました。 pg_dump -Fc -t addr

  • 解決済

    postgresのデータ取得時間を短縮したい

    タイトルの通りpostgresからデータを取得する時間を短縮したいです。 テーブルには550万件ほどデータが格納されております。 日付の範囲を指定してデータを取ってくる

  • 解決済

    postgresのデータ取得時間を短縮したい

    タイトルの通りpostgresからデータを取得する時間を短縮したいです。 以前にも質問させていただいたのですが、前回とは少し内容が変わっております。 テーブルには2700万

  • 解決済

    sqlで割合計算して順番に表示させるには?

    カラム同士で割り算して割合を出して、割合順に表示させるにはどうしたらいいのでしょうか? 例:データ 名前 授業日数 出席数   A 100       80 B    1

  • 解決済

    postgreSQLにて インサートで2つのテーブルに対してインサート

    postgreSQLにて インサートをしたいテーブルが2つある場合 一度に2つインサートすることは可能でしょうか? 可能ならやり方を教えていただきたいです。 abcテー

同じタグがついた質問を見る

  • PostgreSQL

    992questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。