🧮

PostgreSQLの1日あたりのストレージ使用量を計算し、容量上限の時期を試算する

2023/03/24に公開

はじめに

以下の背景から調べました。

クラウド環境でアプリケーションを構築し、運用・保守フェーズに入った時に現在の契約プランでのストレージ量で後何年くらいはデータをそのまま保持できそうかとお問合せをいただいた。

この時の前提として、データの登録サイクルは不規則でなく一定の間隔でデータが送信されてくる DB テーブルだったので 1 日あたりに登録されるレコード数は平均的だった。

こんな感じのシチュエーションでした。

限定的なお話で参考にする人いるのかわからんですが、何かの役に立ったらいいなということで記事にしていきます。

この記事でわかること

この記事で取り扱わないこと

試算手順

  1. 対象のテーブルの 1 レコードにどのくらいの容量が使用されているのかを調べる。
  2. 1 日にどのくらいのレコードが登録されるのか調べる
  3. 1 年間での使用量を計算する
  4. 1 年間の使用量を元にストレージ容量の上限値に達するのが何年後かを試算する

対象のテーブルの 1 レコードにどのくらいの容量が使用されているのかを調べる。

使用量は pg_class で情報となるデータを取得できます。

今回は使うのは relpagesreltuples です。

それぞれの保持する情報は以下です。

  • relpages
    • ブロック数
  • reltuples
    • 行数

relpages は単位が 8KB ごとらしいので計算しやすいよう 8192 をかけて byte に変換します。
それを行数の reltuples で割れば 1 レコードあたりの平均使用量は算出できます。

以上を踏まえて以下の SQL を発行します

DATABASE=> SELECT relname, reltuples, (relpages / 128) as mbytes, (relpages * 8192.0 / (reltuples + 1e-10)) as average_row_size FROM pg_class ORDER BY mbytes DESC;

# 見やすいよう整形
SELECT
	relname,
	reltuples,
	(relpages / 128) as mbytes,
	(relpages * 8192.0 / (reltuples + 1e-10)) as average_row_size
FROM
	pg_class
ORDER BY
	mbytes DESC;

実行結果は以下のようになります。

relname reltuples mbytes average_row_size
table_a 330420 45 145.037225349555
table_b 330420 34 108.51759578718

テーブル(relname)ごとにレコード数(reltuples)、MB 単位の占有サイズ(mbytes)、1 レコードの平均サイズ(average_row_size)で確認できます。

全テーブルに対しての SQL なので特定のテーブルで良いときはテーブル名で絞ってください。

SELECT
	relname,
	reltuples,
	(relpages / 128) as mbytes,
	(relpages * 8192.0 / (reltuples + 1e-10)) as average_row_size
FROM
	pg_class
WHERE
	relname = {table_name}
ORDER BY
	mbytes DESC;

1 日に登録されるレコード件数を調べる

テーブルの作成日ベースで範囲を 1 日にし COUNT することで 1 日のレコード数を取得します。

た。

DATABASE=> SELECT COUNT(*) FROM table_name WHERE datetime >= 'YYYY/MM/DD HH:mm:ss' AND datetime <= 'YYYY/MM/DD HH:mm:ss';

# 見やすいよう整形
SELECT
	COUNT(*)
FROM
	table_name
WHERE
	datetime >= 'YYYY/MM/DD HH:mm:ss'
AND
	datetime <= 'YYYY/MM/DD HH:mm:ss';

ここで取得した件数とさっき取得した 1 レコードあたりの容量を掛ければ、1 日に使用される容量を算出できます。

計算する

後は算数ですね。

先ほど取得した 1 日に使用される容量に 365 を掛け 1 年間での使用量を取得。
1 年分の使用量と上限を比べれば何年後に要領上限に達するかが計算できます。

さいごに

さいごまで読んでいただきありがとうございます。

SQL ベースでのレコード使用量の取得なので、ローカル、オンプレ、クラウドどの環境でも共通して使えるかと思います。

運用しているとこういったコスト面でのお問い合わせはちょくちょく来たりするのでそんな時に役立ったら嬉しいです。

間違いの指摘やリクエストなどありましたら加筆していきたので是非、ご意見をいただけたらと思います。

それではまた次の記事でお会いしましょう。

GitHubで編集を提案

Discussion