web-dev-qa-db-ja.com

(レコードの)サイズとPostgresのオーバーヘッドの見積もり

Postgres 9.4の次の表を検討してください。

CREATE TABLE t
(
  a1 bigserial,
  a2 bigint NOT NULL,
  a3 bigint NOT NULL,
  a4 integer, 
  a5 timestamp with time zone NOT NULL,
  a6 timestamp with time zone NOT NULL DEFAULT now(),
  a7 bigint NOT NULL,
  a8 bigint NOT NULL,
  a9 real,
  a10 integer,

  CONSTRAINT kkkey PRIMARY KEY (a1)
)

このテーブルを保存するための推定コストはどれくらいですか?

記録的な費用:

size(bigserial) 
+ size(bigint) 
+ size(bigint) 
+ size(integer) 
+ size(timestamp) 
+ size(timestamp) 
+ size(bigint) 
+ size(bigint) 
+ size(real) 
+ size(integer)
= 8 + 8 + 8 + 4 + 8 + 8 + 8 + 8 + 4 + 4 = 68 bytes

データベースページレイアウト of Postgresは、レコードがセカンダリストレージにどのように配置されるかについてかなり詳細な情報を提供しますが、すべての数値をまとめる方法がわかりません。

Linuxレポート

blockdev --getbsz /dev/sda1
1024

質問:

(1)行ごとのストレージコストを評価するヘルパー関数はありますか(そのため、これらの複雑な計算を手動で行う必要はありません)

(2)数値をまとめる方法、つまり各行のオーバーヘッドコストを見積もる方法

(3)主キーインデックスのコストを見積もる方法

7
arthur

列、テーブル、インデックスのサイズを指定する関数は、マニュアルに記載されています。 http://www.postgresql.org/docs/9.4/static/functions-admin.html

レコード全体のサイズを計算する関数はありません(個々のデータ値(pg_column_size))、レコードは一般に可変長であるため(圧縮される場合もあります)、カタログクエリを実行してテーブルのすべての列のサイズを合計するか、単に設定されたテーブルのサイズとレコード数で除算し、レコードの平均サイズを取得します。

7
Renzo