第5回では、
データベース・サイジング
サイジングとは、
データファイルの構成
PostgreSQLはデータベース・
要素 | 容量 | 説明 |
---|---|---|
テーブルインデックス | (用途依存) | データを保持できる容量の他、 |
管理情報 | 10MB程度 | システムカタログ等の管理情報が含まれます。 |
トランザクションログ | 100MB~数GB | 停電などの異常停止でもコミット結果を保証するためのログです。更新処理が多い場合には増やすとスループットが向上します。checkpoint_ |
アーカイブログ | (用途依存) | アーカイブリカバリのためにトランザクションログをアーカイブする場合に必要です。サイズはバックアップ保存期間中に更新される領域と同じ程度です。参照主体では容量は小さくて済みますが、 |
コミットログ | 50MB~512MB | トランザクションがコミットしたかロールバックしたかを管理するログです。autovacuum_ |
サーバログ | (用途依存) | サーバログはエラーや警告が発生した際にメッセージが記録されます。デフォルトの設定では古いログは削除されません。繰り返し発生するエラーに気づかずに大量のメッセージが出力されないよう注意しましょう。 |
テーブルサイズの計算
テーブルサイズを計算する際には、
インデックスサイズの計算
よく使われるbtreeインデックスについて説明します。インデックスもテーブルと同様ですが、
計算例
pgbenchベンチマークのaccountsテーブルに対して、
Table "public.pgbench_accounts" Column | Type | Modifiers ----------+---------------+----------- aid | integer | not null bid | integer | abalance | integer | filler | character(84) | (文字列は長さ管理の 1byte を加える) Indexes: "pgbench_accounts_pkey" PRIMARY KEY, btree (aid)
“行データ長”
名前 | 推定値 | 実測値 | |
---|---|---|---|
テーブル | pgbench_ | 13120 KB | 13120 KB |
インデックス | pgbench_ | 2184 KB | 2208 KB |
インデックスの張り方
インデックスは検索処理の高速化に非常に有効ですが、
インデックスの使い分け
PostgreSQLでは、
スカラー値 | 多次元/範囲 | |
---|---|---|
1キー/行 | btree | gist |
多キー/行 | gin | - |
複数列インデックスを使う判断
PostgreSQLは非常に柔軟なインデックスの使い方をします。かなり多くのクエリパターンで複数列インデックスを使うことができますし、
複数列インデックスでは、
=# CREATE INDEX idx_abc ON tbl (a, b, c); =# EXPLAIN SELECT * FROM tbl WHERE a = 1 AND b = 2; => Index Scan on idx_abc (cost=8.27) =# EXPLAIN SELECT * FROM tbl WHERE a = 1 AND c = 3; => Index Scan on idx_abc (cost=8.36) =# EXPLAIN SELECT * FROM tbl WHERE b = 2 AND c = 3; => Bitmap Index Scan on idx_abc (cost=14.91)
また、
=# CREATE INDEX idx_a ON tbl (a); =# CREATE INDEX idx_b ON tbl (b); =# EXPLAIN SELECT * FROM tbl WHERE a = 1 AND b = 2; => Bitmap Heap Scan (cost=12.92) -> BitmapAnd -> Bitmap Index Scan on idx_a -> Bitmap Index Scan on idx_b
インデックスを多くの検索パターンで使うことができるので、
なるべくキーの更新を避ける
インデックスのキーは、
また、
今回は、
- ※)
- 検索処理にて取得するフィールドが全てインデックスに含まれている場合、
インデックススキャンの際にはテーブルにはアクセスせずに処理を高速化する機能です。