infra検証 blog

oracle成分多めです。

テーブル・インデックスサイズ見積もり(PostgreSQL)

はじめに

OSS-DB Gold対策シリーズです。 サンプル問題を解いてまとめます。 https://oss-db.jp/measures/sample

今回は運用管理からテーブル・インデックスサイズの見積もりをまとめました。

テーブルサイズ見積もり

https://oss-db.jp/sample/gold_management_01/01_120210

f:id:macchi09:20201230173330p:plain

見積もり対象のテーブル定義

CREATE TABLE registration (
  id BIGINT PRIMARY KEY,
  reg_event INTEGER NOT NULL,
  reg_client INTEGER NOT NULL,
  reg_date TIMESTAMP NOT NULL
);

50万行レコード作成した場合のテーブルサイズは? ブロックサイズは8192byteとし、インデックスサイズは含めないものとする。

①1行あたりのサイズを求めます。 28 + 8 + 4 + 4 + 8 = 52 (byte)

②1ブロックに入る行数を求めます。 (8192 - 24) / 52 = 157 (行) ※ブロックに入るサイズなので小数点以下は切り捨て

③必要なブロック数を求めます。 500,000 / 157 = 3185 (ブロック) ※ブロック数なので小数点以下は切り上げ

④テーブルサイズを求めます。 8192 * 3185 = 26091520 ≒ 25MB

インデックスサイズ見積もり

https://oss-db.jp/sample/gold_management_01/04_130401

f:id:macchi09:20201230173447p:plain

見積もり対象のインデックス定義

CREATE INDEX member_index ON member_table (team_id, birthday);

100万行レコード作成した場合のテーブルサイズは? team_id:INTEGER、birthday:DATEでどちらもNOT NULL制約あり ブロックサイズは8192byteとし、FILLFACTORは90%とする。

①1ブロックあたり使用できすサイズを求めます。 8192 * 0.9 = 7372 (byte)

②1つのリーフページに格納できる行数を求めます。 (7372 - 24 - 16) / (4 +  8 + 4 + 4) = 7332 / 20 ≒ 366 ※ブロックに入るサイズなので小数点以下は切り捨て

②必要なリーフページ数を求めます。 1,000,000 / 366 ≒ 2733 (ページ) ※ブロックに入るサイズなので小数点以下は切り上げ

③ルートおよびインターナルページの必要数を求めます。 ルートページから参照できるページ数 366ページ 2733 / 366 ≒ 8 (インターナルページ数)

④必要なサイズを求める (2733 + 8 + 1) * 8192 = 22462464 ≒ 22MB

データ型ごとのサイズ一覧(抜粋)

https://www.postgresql.jp/document/11/html/datatype.html

数値データ型

型名 サイズ
smallint 2byte
integer 4byte
bigint 8byte
decimal 可変長
numeric 可変長
real 4byte
double precision 8byte
smallsirial 2byte
serial 4byte
bigserial 8byte

日付/時刻データ型

型名 サイズ
timestamp [(p)] [without time zone] 8byte
timestamp [(p)] [with time zone] 8byte
date 4byte
time [(p)] [without time zone] 8byte
time [(p)] [with time zone] 12byte
interval [ fields] [(p)] 16byte