CheatSheet
日本語 icon日本語English iconEnglish
チートシートとはカンニングペーパーのことです。それが転じて、本来覚えることをまとめておいたものです。
要点をすぐに参照できるようにまとめてみました。

PostgreSQL

エンジニアのためのWebチートシート

PostgreSQLは、高い信頼性と豊富な機能を持つオープンソースのリレーショナルデータベースです。 JSONB、配列型、ウィンドウ関数、CTEなど強力な機能を備えています。 psqlコマンド、データ型、テーブル定義、JSONB操作、インデックス、運用などをチートシートにまとめました。

psql コマンド

接続 & 基本操作

  • psql でデータベースに接続する方法です。

    # 接続
    psql -U username -d dbname
    psql -U username -h localhost -p 5432 -d dbname
    psql "postgresql://user:pass@host:5432/dbname"
    sudo -u postgres psql
    
    # 接続情報の確認
    \conninfo
    
    # データベース切替
    \c other_db
    
    # 終了
    \q

メタコマンド(情報表示)

  • データベースの構造を確認するメタコマンドです。

    \l            # データベース一覧
    \dt           # テーブル一覧
    \dt+          # テーブル一覧(詳細)
    \d table_name # テーブル構造
    \d+ table_name # テーブル構造(詳細)
    \di           # インデックス一覧
    \dv           # ビュー一覧
    \ds           # シーケンス一覧
    \df           # 関数一覧
    \dn           # スキーマ一覧
    \du           # ロール/ユーザー一覧
    \dx           # 拡張機能一覧
    \h SELECT     # SQLコマンドヘルプ
    \?            # psqlコマンド一覧

便利機能

  • psql の実用的な操作コマンドです。

    # SQLファイル実行
    \i /path/to/file.sql
    
    # 拡張表示(縦並び)トグル
    \x
    
    # 実行時間の表示
    \timing
    
    # 出力をファイルに保存
    \o output.txt
    SELECT * FROM users;
    \o
    
    # CSVエクスポート
    \copy users TO '/path/to/users.csv' CSV HEADER
    
    # CSVインポート
    \copy users FROM '/path/to/users.csv' CSV HEADER
    
    # シェルコマンド実行
    \! ls -la
    
    # エディタでクエリ編集
    \e

データ型

PostgreSQL の主要なデータ型の一覧です。

説明
smallint / integer / bigint

2/4/8バイト整数

numeric(p,s) / decimal(p,s)

正確な小数(金額など)

real / double precision

浮動小数点数(4/8バイト)

text / varchar(n) / char(n)

文字列(text 推奨)

boolean

true / false / null

timestamptz / timestamp

日時(timestamptz 推奨)

date / time / interval

日付 / 時刻 / 期間

jsonb / json

JSONデータ(jsonb 推奨、インデックス対応)

uuid

UUID(gen_random_uuid() で生成)

type[]

配列型(任意の型で利用可能)

inet / cidr / macaddr

ネットワークアドレス

bytea

バイナリデータ

配列

  • 配列型の定義と操作です。

    -- 配列カラムの定義
    CREATE TABLE posts (
      id SERIAL PRIMARY KEY,
      tags TEXT[]
    );
    
    -- 配列リテラル
    INSERT INTO posts (tags)
    VALUES (ARRAY['postgresql', 'database']);
    INSERT INTO posts (tags)
    VALUES ('{sql,nosql}');
    
    -- 包含チェック
    SELECT * FROM posts WHERE tags @> ARRAY['postgresql'];
    SELECT * FROM posts WHERE 'sql' = ANY(tags);
    
    -- 配列の長さ
    SELECT array_length(ARRAY[1,2,3], 1);  -- 3
    
    -- 配列の連結
    SELECT ARRAY[1,2] || ARRAY[3,4];  -- {1,2,3,4}
    
    -- 配列を行に展開
    SELECT unnest(ARRAY['a','b','c']);
    
    -- 集約で配列生成
    SELECT array_agg(name) FROM users;

JSON / JSONB 型

  • jsonb 型の基本操作です。json よりも jsonb を推奨します。

    -- JSONB カラムの定義
    CREATE TABLE events (
      id SERIAL PRIMARY KEY,
      data JSONB NOT NULL DEFAULT '{}'
    );
    
    -- 挿入
    INSERT INTO events (data) VALUES
    ('{"type": "click", "page": "/home", "count": 5}');
    
    -- 値の取得
    SELECT data -> 'type' FROM events;     -- "click"(JSON型)
    SELECT data ->> 'type' FROM events;    -- click(テキスト型)
    SELECT data -> 'count' FROM events;    -- 5
    
    -- ネストしたアクセス
    -- {"user": {"name": "Alice", "age": 30}}
    SELECT data #>> '{user,name}' FROM events;  -- Alice
    
    -- 型キャスト
    SELECT (data ->> 'count')::int FROM events;
    
    -- json vs jsonb
    -- json:  テキストそのまま保存、高速な挿入
    -- jsonb: バイナリ保存、高速な検索、インデックス対応

テーブル定義

CREATE TABLE

  • テーブルの作成です。GENERATED ALWAYS AS IDENTITY が推奨されます。

    -- 推奨: GENERATED ALWAYS AS IDENTITY
    CREATE TABLE users (
      id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
      name TEXT NOT NULL,
      email TEXT UNIQUE NOT NULL,
      age INT,
      created_at TIMESTAMPTZ DEFAULT NOW()
    );
    
    -- serial(レガシーだが広く使用)
    CREATE TABLE posts (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      body TEXT,
      published BOOLEAN DEFAULT false,
      created_at TIMESTAMPTZ DEFAULT NOW()
    );
    
    -- テーブル削除
    DROP TABLE IF EXISTS users CASCADE;
    
    -- 全行削除(DELETEより高速)
    TRUNCATE TABLE users RESTART IDENTITY CASCADE;
    
    -- テーブル名変更
    ALTER TABLE users RENAME TO members;

ALTER TABLE

  • カラムの追加、変更、削除です。

    -- カラム追加
    ALTER TABLE users ADD COLUMN phone TEXT;
    
    -- カラム型変更
    ALTER TABLE users ALTER COLUMN name TYPE VARCHAR(200);
    
    -- カラム削除
    ALTER TABLE users DROP COLUMN phone;
    
    -- カラム名変更
    ALTER TABLE users RENAME COLUMN name TO full_name;
    
    -- NOT NULL 制約の追加/削除
    ALTER TABLE users ALTER COLUMN email SET NOT NULL;
    ALTER TABLE users ALTER COLUMN email DROP NOT NULL;
    
    -- デフォルト値の設定
    ALTER TABLE users
    ALTER COLUMN created_at SET DEFAULT NOW();
    
    -- デフォルト値の削除
    ALTER TABLE users
    ALTER COLUMN created_at DROP DEFAULT;

制約

  • 主キー、外部キー、CHECK制約などです。

    -- 主キー
    CREATE TABLE users (
      id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY
    );
    
    -- 外部キー
    CREATE TABLE orders (
      id SERIAL PRIMARY KEY,
      user_id INT REFERENCES users(id) ON DELETE CASCADE
    );
    
    -- UNIQUE 制約
    ALTER TABLE users ADD CONSTRAINT uq_email UNIQUE (email);
    
    -- CHECK 制約
    ALTER TABLE users ADD CONSTRAINT chk_age CHECK (age >= 0);
    
    -- 複合主キー
    CREATE TABLE user_roles (
      user_id INT REFERENCES users(id),
      role_id INT REFERENCES roles(id),
      PRIMARY KEY (user_id, role_id)
    );
    
    -- 複合 UNIQUE
    ALTER TABLE users
    ADD CONSTRAINT uq_name_email UNIQUE (name, email);
    
    -- 制約の削除
    ALTER TABLE users DROP CONSTRAINT uq_email;

PostgreSQL固有の構文

RETURNING & UPSERT

  • INSERT/UPDATE/DELETEの結果を返す RETURNING と、ON CONFLICT による UPSERT です。

    -- RETURNING: 操作結果を返す
    INSERT INTO users (name, email)
    VALUES ('Alice', 'alice@example.com')
    RETURNING id, name;
    
    UPDATE users SET name = 'Bob' WHERE id = 1
    RETURNING *;
    
    DELETE FROM users WHERE id = 1
    RETURNING id, name;
    
    -- UPSERT (ON CONFLICT)
    -- 衝突時に更新
    INSERT INTO users (email, name)
    VALUES ('alice@example.com', 'Alice')
    ON CONFLICT (email)
    DO UPDATE SET name = EXCLUDED.name;
    
    -- 衝突時に何もしない
    INSERT INTO users (email, name)
    VALUES ('alice@example.com', 'Alice')
    ON CONFLICT (email) DO NOTHING;
    
    -- 条件付き UPSERT
    INSERT INTO users (email, name, updated_at)
    VALUES ('alice@example.com', 'Alice', NOW())
    ON CONFLICT (email)
    DO UPDATE SET
      name = EXCLUDED.name,
      updated_at = EXCLUDED.updated_at
    WHERE users.name != EXCLUDED.name;

DISTINCT ON & ILIKE

  • PostgreSQL固有の強力なクエリ構文です。

    -- DISTINCT ON(グループの最初の行を取得)
    -- 各部署で最も給料が高い社員
    SELECT DISTINCT ON (department)
      department, name, salary
    FROM employees
    ORDER BY department, salary DESC;
    
    -- ILIKE(大文字小文字を無視した LIKE)
    SELECT * FROM users WHERE name ILIKE '%alice%';
    SELECT * FROM users WHERE email ILIKE '%@gmail.com';
    
    -- 型キャスト(PostgreSQL構文)
    SELECT '42'::integer;
    SELECT NOW()::date;
    SELECT '{"a":1}'::jsonb;
    
    -- FILTER(集約関数のフィルタ)
    SELECT
      COUNT(*) AS total,
      COUNT(*) FILTER (WHERE active) AS active_count,
      AVG(salary) FILTER (WHERE department = 'eng') AS eng_avg
    FROM employees;
    
    -- GENERATE_SERIES(連番生成)
    SELECT generate_series(1, 10);
    SELECT generate_series(
      '2024-01-01'::date,
      '2024-12-31'::date,
      '1 month'::interval
    );

LATERAL JOIN & 集合演算

  • 相関サブクエリ的な LATERAL JOIN と集合演算です。

    -- LATERAL JOIN(外側のクエリを参照できる)
    -- 各ユーザーの直近3件の注文を取得
    SELECT u.name, recent.*
    FROM users u
    LEFT JOIN LATERAL (
      SELECT total, created_at
      FROM orders
      WHERE user_id = u.id
      ORDER BY created_at DESC
      LIMIT 3
    ) recent ON true;
    
    -- UNION / INTERSECT / EXCEPT
    SELECT name FROM employees
    UNION
    SELECT name FROM contractors;
    
    SELECT name FROM employees
    INTERSECT
    SELECT name FROM managers;
    
    SELECT name FROM employees
    EXCEPT
    SELECT name FROM managers;
    
    -- STRING_AGG(文字列連結の集約)
    SELECT department,
      STRING_AGG(name, ', ' ORDER BY name)
    FROM employees
    GROUP BY department;
    
    -- ARRAY_AGG
    SELECT department, ARRAY_AGG(name ORDER BY name)
    FROM employees GROUP BY department;

JSON / JSONB

JSONB の演算子一覧です。

演算子説明
->

キー/インデックスで取得(JSON型で返す)

>>

キー/インデックスで取得(テキストで返す)

#>

パスで取得(JSON型)例: data #> '{a,b}'

#>>

パスで取得(テキスト型)

?

キーが存在するか

@>

左が右を含むか

||

JSONB の連結(マージ)

-

キーまたは配列要素の削除

#-

パス指定で削除

JSONB クエリ & 更新

  • JSONB データの検索と更新です。

    -- キーの存在チェック
    SELECT * FROM events WHERE data ? 'type';
    
    -- 値による検索
    SELECT * FROM events
    WHERE data ->> 'type' = 'click';
    
    -- 包含検索(GINインデックスで高速)
    SELECT * FROM events
    WHERE data @> '{"type": "click"}';
    
    -- ネストした値の検索
    SELECT * FROM events
    WHERE data #>> '{user,name}' = 'Alice';
    
    -- 数値比較
    SELECT * FROM events
    WHERE (data ->> 'count')::int > 10;
    
    -- 値の更新(jsonb_set)
    UPDATE events
    SET data = jsonb_set(data, '{count}', '10')
    WHERE id = 1;
    
    -- キーの追加(||で連結)
    UPDATE events
    SET data = data || '{"new_key": "value"}'
    WHERE id = 1;
    
    -- キーの削除
    UPDATE events
    SET data = data - 'old_key'
    WHERE id = 1;

JSONB 関数

  • JSONB の主要な関数です。

    -- jsonb_set: パス指定で値を更新
    SELECT jsonb_set(
      '{"a":1,"b":2}'::jsonb,
      '{a}',
      '100'
    );  -- {"a": 100, "b": 2}
    
    -- jsonb_strip_nulls: null値を除去
    SELECT jsonb_strip_nulls(
      '{"a":1,"b":null}'::jsonb
    );  -- {"a": 1}
    
    -- jsonb_each: key-valueペアに展開
    SELECT * FROM jsonb_each('{"a":1,"b":2}'::jsonb);
    -- key | value
    -- a   | 1
    -- b   | 2
    
    -- jsonb_array_elements: 配列要素を展開
    SELECT * FROM jsonb_array_elements('[1,2,3]'::jsonb);
    
    -- jsonb_object_keys: キー一覧
    SELECT jsonb_object_keys('{"a":1,"b":2}'::jsonb);
    
    -- to_jsonb: レコードをJSONBに変換
    SELECT to_jsonb(row) FROM (
      SELECT name, email FROM users LIMIT 1
    ) row;
    
    -- jsonb_agg: 集約してJSON配列に
    SELECT jsonb_agg(to_jsonb(u))
    FROM users u;
    
    -- jsonb_build_object: オブジェクト構築
    SELECT jsonb_build_object(
      'name', name, 'email', email
    ) FROM users;

ウィンドウ関数 & CTE

ウィンドウ関数

  • 行番号、順位、前後の行の値を取得する関数です。

    -- ROW_NUMBER: 連番
    SELECT name, salary,
      ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
    FROM employees;
    
    -- RANK / DENSE_RANK: 順位
    SELECT name, salary,
      RANK() OVER (ORDER BY salary DESC) AS rank,
      DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
    FROM employees;
    
    -- PARTITION BY: グループ内での計算
    SELECT department, name, salary,
      ROW_NUMBER() OVER (
        PARTITION BY department ORDER BY salary DESC
      ) AS dept_rank
    FROM employees;
    
    -- LAG / LEAD: 前後の行の値
    SELECT date, revenue,
      LAG(revenue) OVER (ORDER BY date) AS prev,
      LEAD(revenue) OVER (ORDER BY date) AS next
    FROM daily_sales;
    
    -- 累計・移動平均
    SELECT date, revenue,
      SUM(revenue) OVER (ORDER BY date) AS running_total,
      AVG(revenue) OVER (
        ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
      ) AS weekly_avg
    FROM daily_sales;
    
    -- NTILE: N分割
    SELECT name, salary,
      NTILE(4) OVER (ORDER BY salary) AS quartile
    FROM employees;

CTE(共通テーブル式)

  • WITH句を使った可読性の高いサブクエリです。

    -- 基本 CTE
    WITH active_users AS (
      SELECT * FROM users
      WHERE last_login > NOW() - INTERVAL '30 days'
    )
    SELECT * FROM active_users
    WHERE country = 'JP';
    
    -- 複数 CTE
    WITH
      high_spenders AS (
        SELECT user_id, SUM(total) AS spent
        FROM orders
        GROUP BY user_id
        HAVING SUM(total) > 100000
      ),
      recent_users AS (
        SELECT * FROM users
        WHERE created_at > NOW() - INTERVAL '1 year'
      )
    SELECT r.name, h.spent
    FROM recent_users r
    JOIN high_spenders h ON r.id = h.user_id;
    
    -- CTE で INSERT/UPDATE/DELETE
    WITH deleted AS (
      DELETE FROM sessions
      WHERE expired_at < NOW()
      RETURNING *
    )
    INSERT INTO session_archive
    SELECT * FROM deleted;

再帰CTE

  • 階層データやツリー構造をたどる再帰クエリです。

    -- 階層構造(組織図など)
    WITH RECURSIVE subordinates AS (
      -- ベースケース(ルート)
      SELECT id, name, manager_id, 1 AS depth
      FROM employees
      WHERE id = 1
      UNION ALL
      -- 再帰ケース
      SELECT e.id, e.name, e.manager_id, s.depth + 1
      FROM employees e
      INNER JOIN subordinates s ON s.id = e.manager_id
    )
    SELECT * FROM subordinates;
    
    -- 連番生成
    WITH RECURSIVE nums AS (
      SELECT 1 AS n
      UNION ALL
      SELECT n + 1 FROM nums WHERE n < 100
    )
    SELECT * FROM nums;
    
    -- カテゴリツリー(パス構築)
    WITH RECURSIVE cat_tree AS (
      SELECT id, name, parent_id,
        name::text AS path
      FROM categories WHERE parent_id IS NULL
      UNION ALL
      SELECT c.id, c.name, c.parent_id,
        ct.path || ' > ' || c.name
      FROM categories c
      JOIN cat_tree ct ON ct.id = c.parent_id
    )
    SELECT * FROM cat_tree ORDER BY path;

インデックス & パフォーマンス

PostgreSQL がサポートするインデックス種類の一覧です。

種類用途
B-tree

デフォルト。等値・範囲・ソートに最適

Hash

等値検索のみ(B-treeで代替可能な場合が多い)

GIN

JSONB、配列、全文検索に最適

GiST

幾何データ、範囲型、全文検索

BRIN

時系列・ログデータ(非常にコンパクト)

SP-GiST

IPアドレス、電話番号など非均衡データ

実践インデックス

  • 用途別のインデックス作成パターンです。

    -- 基本インデックス(B-tree)
    CREATE INDEX idx_users_email ON users (email);
    
    -- ユニークインデックス
    CREATE UNIQUE INDEX idx_users_email
    ON users (email);
    
    -- 複合インデックス
    CREATE INDEX idx_orders_user_date
    ON orders (user_id, created_at);
    
    -- 部分インデックス(条件付き)
    CREATE INDEX idx_active_users
    ON users (email) WHERE active = true;
    
    -- GIN インデックス(JSONB用)
    CREATE INDEX idx_data_gin ON events USING GIN (data);
    
    -- GIN インデックス(配列用)
    CREATE INDEX idx_tags_gin ON posts USING GIN (tags);
    
    -- BRIN インデックス(時系列用)
    CREATE INDEX idx_logs_brin
    ON logs USING BRIN (created_at);
    
    -- 並行インデックス作成(テーブルロックなし)
    CREATE INDEX CONCURRENTLY idx_name
    ON table_name (column);
    
    -- インデックス削除・再構築
    DROP INDEX IF EXISTS idx_name;
    REINDEX INDEX idx_name;

EXPLAIN & 分析

  • クエリの実行計画を確認する方法です。

    -- 実行計画の確認
    EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
    
    -- 実際に実行して詳細分析
    EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
    SELECT * FROM users WHERE email = 'test@example.com';
    
    -- 出力をJSON形式で取得
    EXPLAIN (ANALYZE, FORMAT JSON)
    SELECT * FROM users WHERE id = 1;
    
    -- テーブル統計情報
    SELECT * FROM pg_stat_user_tables;
    
    -- インデックス統計
    SELECT * FROM pg_stat_user_indexes;
    
    -- アクティブセッション
    SELECT pid, state, query, query_start
    FROM pg_stat_activity
    WHERE state = 'active';
    
    -- テーブルサイズ
    SELECT pg_size_pretty(pg_total_relation_size('users'));
    
    -- データベースサイズ
    SELECT pg_size_pretty(pg_database_size(current_database()));
    
    -- 長時間クエリの確認
    SELECT pid, NOW() - query_start AS duration, query
    FROM pg_stat_activity
    WHERE state = 'active'
    ORDER BY duration DESC;

ユーザー & 権限

ロール管理

  • ユーザー/ロールの作成と管理です。

    -- ユーザー(ログイン可能なロール)作成
    CREATE ROLE myuser WITH LOGIN PASSWORD 'secret';
    
    -- スーパーユーザー
    CREATE ROLE admin WITH SUPERUSER LOGIN PASSWORD 'secret';
    
    -- DB作成権限付きロール
    CREATE ROLE dev WITH LOGIN PASSWORD 'secret' CREATEDB;
    
    -- パスワード変更
    ALTER ROLE myuser WITH PASSWORD 'newsecret';
    
    -- ロール削除
    DROP ROLE IF EXISTS myuser;
    
    -- 現在のユーザー確認
    SELECT current_user;
    SELECT current_database();
    
    -- ロール一覧
    \du
    SELECT rolname, rolsuper, rolcreatedb, rolcanlogin
    FROM pg_roles;

権限

  • テーブルやスキーマへの権限付与です。

    -- データベース権限
    GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
    
    -- テーブル権限
    GRANT SELECT, INSERT, UPDATE ON users TO myuser;
    GRANT ALL ON ALL TABLES IN SCHEMA public TO myuser;
    
    -- スキーマ権限
    GRANT USAGE ON SCHEMA myschema TO myuser;
    
    -- シーケンス権限
    GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO myuser;
    
    -- 新規オブジェクトへのデフォルト権限
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO readonly_user;
    
    -- 権限取消
    REVOKE ALL ON DATABASE mydb FROM myuser;
    
    -- 読み取り専用ユーザーの作成例
    CREATE ROLE readonly WITH LOGIN PASSWORD 'secret';
    GRANT CONNECT ON DATABASE mydb TO readonly;
    GRANT USAGE ON SCHEMA public TO readonly;
    GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO readonly;

トランザクション

  • BEGIN/COMMIT/ROLLBACK とセーブポイントです。

    -- 基本
    BEGIN;
      INSERT INTO accounts (name, balance) VALUES ('Alice', 1000);
      UPDATE accounts SET balance = balance - 500 WHERE name = 'Bob';
    COMMIT;
    
    -- ロールバック
    BEGIN;
      DELETE FROM users WHERE id = 1;
    ROLLBACK;
    
    -- セーブポイント
    BEGIN;
      INSERT INTO orders (...) VALUES (...);
      SAVEPOINT my_savepoint;
      UPDATE inventory SET stock = stock - 1 WHERE id = 1;
      -- 失敗した場合
      ROLLBACK TO my_savepoint;
    COMMIT;
    
    -- 分離レベル
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;   -- デフォルト
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    -- 読み取り専用トランザクション
    BEGIN READ ONLY;
      SELECT * FROM users;
    COMMIT;

運用 & バックアップ

バックアップ & リストア

  • pg_dump / pg_restore によるバックアップと復元です。

    # 全データベースバックアップ
    pg_dumpall -U postgres > all_databases.sql
    
    # 単一データベースバックアップ
    pg_dump -d mydb -f backup.sql                # プレーンSQL
    pg_dump -Fc -d mydb -f backup.dump           # カスタム形式(圧縮)
    pg_dump -Fd -d mydb -f backup_dir -j 4       # ディレクトリ形式(並列)
    
    # スキーマのみ / データのみ
    pg_dump -s -d mydb -f schema_only.sql
    pg_dump -a -d mydb -f data_only.sql
    
    # 特定テーブルのみ
    pg_dump -d mydb -t users -f users_backup.sql
    
    # リストア
    psql -d mydb < backup.sql                    # プレーンSQL
    pg_restore -d mydb backup.dump               # カスタム形式
    pg_restore -d mydb backup_dir -j 4           # 並列リストア
    
    # 新しいDBにリストア
    createdb newdb
    pg_restore -d newdb backup.dump

VACUUM & メンテナンス

  • 統計情報の更新と不要領域の回収です。

    -- VACUUM: 不要領域の回収
    VACUUM users;
    
    -- VACUUM ANALYZE: 回収 + 統計情報更新
    VACUUM ANALYZE users;
    
    -- VACUUM FULL: テーブル再構築(排他ロック)
    VACUUM FULL users;
    
    -- ANALYZE: 統計情報のみ更新
    ANALYZE users;
    
    -- REINDEX: インデックス再構築
    REINDEX TABLE users;
    REINDEX DATABASE mydb;
    
    -- 拡張機能の追加
    CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
    CREATE EXTENSION IF NOT EXISTS pg_trgm;
    
    -- 設定の確認
    SHOW shared_buffers;
    SHOW work_mem;
    SHOW max_connections;
    
    -- スキーマ管理
    CREATE SCHEMA IF NOT EXISTS myschema;
    DROP SCHEMA IF EXISTS myschema CASCADE;
    SET search_path TO myschema, public;

引用・参考リンク

Related Goods

  • SQLを初級から脱却したい方に!
達人のテクニックを体系的に学べる定番書籍です。
    SQLを初級から脱却したい方に! 達人のテクニックを体系的に学べる定番書籍です。
    詳細をみる
  • 読みやすく保守しやすいSQLを書くための35の原則。
実務で即使えるノウハウが満載です。
    読みやすく保守しやすいSQLを書くための35の原則。 実務で即使えるノウハウが満載です。
    詳細をみる
  • ケーブルに取り付け可能なTypeCとLightningの変換アダプタです。
スタイリッシュなデザインで、Apple製品との相性抜群です。
    ケーブルに取り付け可能なTypeCとLightningの変換アダプタです。 スタイリッシュなデザインで、Apple製品との相性抜群です。
    詳細をみる
  • お気に入りのサウンドデバイスをすぐ取り出せる位置にディスプレイさせておくことができます。
    お気に入りのサウンドデバイスをすぐ取り出せる位置にディスプレイさせておくことができます。
    詳細をみる

WebTerm - Recommended tools

WebTermは、ブラウザでLinuxコマンド・Gitコマンドを安全に実行でき、チュートリアル式で学べるターミナルサンドボックスです。
AIコーディングツールの普及に伴い、CLIの基礎知識を身につける重要性は増しています。実際のターミナルを操作するのに抵抗がある方でも、WebTermはローカル環境を壊す心配がありません。「会員登録不要・無料」で利用でき、学習環境として最適です。

WebTerm Logo

WebTerm

Browser Terminal Sandbox for Learning CLI

開く

All Cheatsheets

エンジニア・プログラマー向けの便利なチートシートを多数まとめています(SP/Tablet/PC対応)
すべてのチートシートを見る