テーブル・インデックスサイズ見積もり(PostgreSQL)
はじめに
OSS-DB Gold対策シリーズです。 サンプル問題を解いてまとめます。 https://oss-db.jp/measures/sample
今回は運用管理からテーブル・インデックスサイズの見積もりをまとめました。
テーブルサイズ見積もり
https://oss-db.jp/sample/gold_management_01/01_120210
見積もり対象のテーブル定義
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
見積もり対象のインデックス定義
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 |