Postgres 用語集
PostgreSQL の用語を、実行できる SQL で解説
各項目には、短い定義、標準の PostgreSQL で動く例、そして根拠とした公式ドキュメントへのリンクを掲載しています。
行レベルセキュリティ(RLS)
行レベルセキュリティを使うと、CREATE POLICY で作成したポリシーにより、各ロールがどの行を参照・変更できるかをテーブルが行単位で決められます。
シーケンシャルスキャン
シーケンシャルスキャンは、テーブルのすべての行を先頭から末尾まで読み取ります。EXPLAIN では Seq Scan と表示され、小さなテーブルや多くの行を返すクエリでは通常の選択です。
インデックススキャン
インデックススキャンは、インデックスを使って条件に合う行を見つけ、それらをテーブルから取得します。EXPLAIN では Index Scan と表示され、Index Only Scan ではテーブルの読み取りを省略できます。
コネクションプーリング
PostgreSQL の各接続はそれぞれ専用のサーバープロセスで処理されるため、コネクションプーリングでは一定数のデータベース接続を開いたままにして、多数のクライアントで共有します。
VACUUM と autovacuum
VACUUM は、更新や削除の後に残る不要な行バージョンが占める領域を回収し、可視性マップを更新して、トランザクション ID の周回(wraparound)を防ぎます。autovacuum がこれを自動で実行します。
マルチバージョン同時実行制御(MVCC)
MVCC により、読み取りと書き込みを同時に実行できます。各文はデータのスナップショットを参照し、更新は行をその場で上書きせずに新しい行バージョンを書き込みます。
ログ先行書き込み(WAL)
ログ先行書き込みは、すべての変更をデータファイルに反映する前に記録するため、PostgreSQL はクラッシュ後に復旧できます。WAL はレプリケーションやポイントインタイムリカバリにも使われます。
EXPLAIN と EXPLAIN ANALYZE
EXPLAIN は PostgreSQL がクエリをどう実行するつもりかを表示します。EXPLAIN ANALYZE はさらにクエリを実際に実行し、各ステップの実際の行数と所要時間を報告します。
主キー
主キーは、各行を一意に識別する列または列の組です。PostgreSQL は一意の B-tree インデックスと NOT NULL によってこれを強制します。
外部キー
外部キーは、あるテーブルの値が別のテーブルの行と一致することを要求するため、存在しない行を指すことはできません。参照先の行が削除されたときの動作は ON DELETE で決まります。
トランザクション分離レベル
分離レベルは、同時実行中の他のトランザクションによる変更を、あるトランザクションがどこまで参照できるかを決めます。PostgreSQL のデフォルトは Read Committed で、Repeatable Read と Serializable も利用できます。
デッドロック
デッドロックは、2 つのトランザクションが互いに相手の保持しているロックを待つことで発生します。PostgreSQL はこれを検出していずれか一方をキャンセルします。一貫した順序でロックを取得すれば防ぐことができます。
B-tree インデックス
B-tree は PostgreSQL のデフォルトのインデックス型です。ソート可能なデータに対する等値比較と範囲比較を扱い、ソート済みの状態で行を返すことができます。
GIN インデックス
GIN(汎用転置)インデックスは、配列の要素、JSONB のキー、テキスト検索の単語など、値の内部にある各要素を、それを含む行に対応付けます。
部分インデックス
部分インデックスは WHERE 条件に一致する行だけを対象とするため、クエリがテーブルの明確に定義された一部を対象とする場合に、小さく高速なインデックスになります。
共通テーブル式(CTE)
共通テーブル式は WITH で記述し、サブクエリに名前を付けて、文の残りの部分でテーブルのように使えるようにします。WITH RECURSIVE を使うと木構造や階層を扱えます。
JSONB 型
jsonb は JSON を分解されたバイナリ形式で保存するため、高速にクエリでき、インデックスも作成できます。ほとんどのアプリケーションが使うべき JSON 型です。
マテリアライズドビュー
マテリアライズドビューはクエリの結果を保存し、テーブルのように読み取れるようにします。読み取りは高速ですが、データが変わるのは REFRESH MATERIALIZED VIEW を実行したときだけです。
テーブルパーティショニング
パーティショニングは、1 つの論理テーブルを範囲、リスト、ハッシュによって小さな物理テーブルに分割するため、クエリやメンテナンスは必要なパーティションだけを対象にできます。
アップサート(INSERT ... ON CONFLICT)
INSERT ... ON CONFLICT は、行を挿入するか、一意制約に違反する場合は既存の行を更新またはスキップする処理を、1 つのアトミックな操作として行います。
ウィンドウ関数
ウィンドウ関数は、順位や累計など、関連する行の集合にわたって値を計算します。GROUP BY のようにそれらの行を 1 行にまとめることはありません。
スキーマ
スキーマは、データベース内でテーブル、ビュー、関数などのオブジェクトを格納する名前空間です。修飾されていない名前をどこで探すかは search_path で決まります。
ロールと権限
PostgreSQL では、ユーザーもグループもどちらもロールです。GRANT はオブジェクトに対する権限をロールに付与し、別のロールのメンバーであるロールは、そのロールの権限を使用できます。
IDENTITY 列
IDENTITY 列は、暗黙のシーケンスから値を自動的に取得します。PostgreSQL で自動採番のキーを作成する、SQL 標準に準拠した方法です。
全文検索
全文検索は、完全一致の部分文字列ではなく単語によってドキュメントを照合する機能で、tsvector、tsquery、@@ 演算子を使います。GIN インデックスを使うと高速になります。