パフォーマンス最適化ガイド

Guides
最終更新: 2026年2月16日

HarborDB パフォーマンス最適化ガイドへようこそ。この包括的なリソースは、効率的なクエリの記述から、最大のパフォーマンスを得るための HarborDB と macOS の設定まで、PostgreSQL ワークフローのあらゆる側面を最適化するのに役立ちます。

パフォーマンス要因の理解

HarborDB でのデータベースパフォーマンスに影響する要因はいくつかあります:

| 要因 | 影響度 | 最適化レベル | | ---------------------------- | ---------- | ------------------ | | クエリ設計 | 高い | アプリケーション | | データベースインデックス | 高い | データベース | | ネットワーク接続 | 中程度 | インフラストラクチャ | | システムリソース | 中程度 | macOS | | HarborDB 設定 | 低~中程度 | アプリケーション | | PostgreSQL 設定 | 高い | データベース |

クエリ最適化

効率的なクエリの記述

1. 必要なものだけを選択する

-- ❌ 非効率
SELECT * FROM customers;

-- ✅ 効率的
SELECT customer_id, name, email FROM customers;

2. WHERE 句を効果的に使用する

-- ❌ 非効率(全テーブルスキャン)
SELECT * FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 2024;

-- ✅ 効率的(インデックスを使用)
SELECT * FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date < '2025-01-01';

3. 結果セットを制限する

-- 探索時は常に制限する
SELECT * FROM large_table LIMIT 100;

-- 大規模な結果にはページネーションを使用
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 50 OFFSET 0;

4. N+1 クエリ問題を避ける

-- ❌ 非効率(複数クエリ)
-- 最初のクエリ: SELECT * FROM orders WHERE status = 'pending'
-- 各注文に対して: SELECT * FROM customers WHERE customer_id = ?

-- ✅ 効率的(JOIN を使用した単一クエリ)
SELECT o.*, c.name, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.status = 'pending';

EXPLAIN を使用したクエリ分析

HarborDB ではクエリパフォーマンスを簡単に分析できます:

  1. クエリをエディタに記述
  2. ツールバーの 「説明」(⚡)をクリック
  3. 実行計画を結果ペインで確認

EXPLAIN 出力の理解

  • Seq Scan: 全テーブルスキャン(大規模テーブルではしばしば遅い)
  • Index Scan: インデックスを使用(通常より高速)
  • Nested Loop: テーブルの結合(適切かどうか確認)
  • コスト推定: 数値が高いほど作業量が多い

一般的な最適化パターン

-- 不足しているインデックスの提案を追加
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 1234;

-- 結果に表示される可能性: "Seq Scan on orders"
-- 解決策: CREATE INDEX idx_orders_customer_id ON orders(customer_id);

データベースインデックス最適化

インデックスを追加するタイミング

以下のためにインデックスを追加:

  • 主キー(自動的にインデックス付き)
  • 外部キー(しばしば手動でのインデックス付けが必要)
  • 頻繁にフィルタリングされる列
  • 頻繁にソートされる列
  • JOIN 条件で使用される列

効果的なインデックスの作成

-- 単一列インデックス
CREATE INDEX idx_orders_status ON orders(status);

-- 複数列インデックス(順序が重要!)
CREATE INDEX idx_orders_date_status ON orders(order_date, status);

-- 部分インデックス(特定のサブセット用)
CREATE INDEX idx_active_users ON users(email) WHERE active = true;

-- 制約用の一意インデックス
CREATE UNIQUE INDEX idx_unique_email ON users(email);

インデックスのメンテナンス

-- インデックス使用状況の確認
SELECT schemaname, tablename, indexname
FROM pg_stat_user_indexes
WHERE idx_scan = 0;  -- 使用されていないインデックス

-- 断片化したインデックスの再構築
REINDEX INDEX idx_orders_status;

-- クエリプランナーのための統計情報の更新
ANALYZE orders;

接続最適化

接続プール設定

HarborDB 接続を最適化:

  1. 環境設定を開く接続
  2. ワークフローに基づいて設定を調整

| 設定 | 推奨値 | 目的 | | ---------------------- | ----------------- | --------------------------- | | 接続タイムアウト | 30 秒 | ハング接続の防止 | | キープアライブ | 有効 | アイドル接続の維持 | | 最大接続数 | 5-10 | パフォーマンス/メモリのバランス | | SSL モード | Prefer | オーバーヘッドなしで安全 |

ネットワーク最適化

リモートデータベースの場合:

  1. SSH トンネリングを使用 して安全で最適化された接続を実現
  2. 大規模な結果セットに圧縮を有効化
  3. 負荷の高いクエリをピーク時間外にスケジュール
  4. 組み込みツールでネットワーク遅延を監視
-- ネットワーク遅延のテスト
SELECT 1 as test;  -- 往復時間を計測するための単純なクエリ

HarborDB パフォーマンス設定

メモリ管理

環境設定パフォーマンス でメモリ使用量を調整:

| 設定 | 推奨 | 影響 | | --------------------- | -------------- | ----------------------------- | | クエリキャッシュ | 256 MB | 繰り返しクエリを高速化 | | 結果セットメモリ | 512 MB | 大規模データセットの処理 | | ストリーミングモード | 有効 | 大規模な結果に適している | | 自動更新 | 30 秒 | 鮮度/パフォーマンスのバランス |

インターフェース最適化

  1. 環境設定 → 外観でアニメーションを無効化
  2. 自動補完遅延を 100ms に削減
  3. サイドバーの自動展開深度を制限
  4. OLED ディスプレイの効率のためにダークモードを使用

スピード向上のキーボードショートカット

これらの生産性向上ツールをマスター:

| ショートカット | アクション | 節約時間 | | -------- | -------------- | -------------- | | ⌘ + R | クエリを実行 | 2-3 秒 | | ⌘ + . | クエリをキャンセル | 待機を防止 | | ⌘ + T | 新しいクエリタブ | 1-2 秒 | | ⌘ + S | クエリを保存 | 1 秒 | | ⌘ + E | 結果をエクスポート | 2 秒 | | ⌘ + F | クエリ内を検索 | 3-5 秒 |

macOS システム最適化

ハードウェアの考慮事項

メモリ (RAM)

  • 最小: 基本的な使用には 8 GB
  • 推奨: プロフェッショナル作業には 16 GB
  • 最適: 大規模データセットには 32 GB

ストレージ (SSD)

  • 最小: 256 GB の空き容量
  • 推奨: データベースファイルとエクスポート用に 512 GB+
  • 大規模なデータベースストレージには外部 SSD を使用

プロセッサ

  • Apple Silicon: M1/M2/M3 最適化
  • Intel: i5 最小、i7/i9 推奨

macOS 設定

  1. 省エネルギー(システム環境設定):

    • 「ハードディスクをスリープさせない」を無効化
    • 長時間のクエリ中はディスプレイをオンに維持
  2. アクティビティモニタ

    • HarborDB のメモリ使用量を監視
    • PostgreSQL プロセスのリソースを確認
  3. ディスクユーティリティ

    • SSD TRIM が有効であることを確認
    • ディスクの健全性と空き容量を監視

ターミナルパフォーマンスコマンド

# システムリソースを確認
top -o cpu  # CPU 使用率
vm_stat     # メモリ使用率
iostat      # ディスク I/O

# HarborDB を具体的に監視
ps aux | grep HarborDB
lsof -p $(pgrep HarborDB) | wc -l  # 開いているファイル数

大規模データセット戦略

数百万行の作業

1. サーバーサイドページネーション

-- すべての行を読み込む代わりに
SELECT * FROM huge_table;

-- ページネーションを使用
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 0;

-- 次のページ
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 1000;

2. 結果のストリーミング

環境設定パフォーマンス で有効化:

  • ✅ 「10,000 行以上の結果でストリーミングを有効化」
  • ✅ 「ストリーミングチャンクサイズ:1000 行」
  • ✅ 「バックグラウンドストリーミング:有効」

3. マテリアライズドビュー

-- 高コストなクエリを事前計算
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT
    DATE(order_date) as day,
    COUNT(*) as orders,
    SUM(total) as revenue
FROM orders
GROUP BY DATE(order_date);

-- 定期的に更新
REFRESH MATERIALIZED VIEW daily_sales_summary;

エクスポート最適化

大規模なエクスポートの場合:

  1. CSV にエクスポート(JSON より効率的)
  2. チャンクエクスポートを使用(環境設定 → エクスポート)
  3. エクスポートを自動的に圧縮
  4. 外部ストレージに直接エクスポート

パフォーマンス監視

組み込み HarborDB ツール

  1. クエリタイマー: ステータスバーに実行時間を表示
  2. メモリモニター: ウィンドウ → パフォーマンスモニターで表示
  3. 接続ステータス: リアルタイムネットワークメトリクス
  4. クエリ履歴: 過去のクエリパフォーマンスを確認

PostgreSQL 監視クエリ

-- アクティブなクエリ
SELECT
    pid,
    usename,
    query_start,
    state,
    query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start DESC;

-- 遅いクエリ
SELECT
    query,
    calls,
    total_time,
    mean_time,
    rows
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

-- テーブル統計
SELECT
    schemaname,
    relname,
    seq_scan,
    idx_scan,
    n_tup_ins,
    n_tup_upd,
    n_tup_del
FROM pg_stat_user_tables
ORDER BY seq_scan DESC;

一般的なパフォーマンス問題と解決策

問題: 「クエリに時間がかかりすぎる」

解決策チェックリスト:

  1. [ ] 適切なインデックスを追加
  2. [ ] クエリをより効率的に書き直す
  3. [ ] PostgreSQL 設定を確認
  4. [ ] ネットワーク接続を確認
  5. [ ] 必要に応じてタイムアウト設定を増やす

問題: 「HarborDB がメモリを使いすぎる」

解決ステップ:

  1. クエリキャッシュサイズを減らす(環境設定 → パフォーマンス)
  2. 未使用のクエリタブを閉じる
  3. HarborDB を定期的に再起動
  4. メモリリークを確認(アクティビティモニター)
  5. 常に制限に達している場合はシステム RAM を増やす

問題: 「エクスポート/インポートが非常に遅い」

最適化のヒント:

  1. JSON の代わりに CSV 形式を使用
  2. ターゲットフォルダのウイルス対策スキャンを無効化
  3. HDD の代わりに SSD にエクスポート
  4. 非常に大規模な操作には PostgreSQL ネイティブツール(pg_dump/pg_restore)を使用
  5. 大規模な操作を小さなバッチに分割

問題: 「インターフェースがもたつく感じる」

クイック修正:

  1. 非常に大規模なクエリではシンタックスハイライトを無効化
  2. サイドバーの自動展開を減らす
  3. よりシンプルな UI テーマを使用
  4. 他のリソース集約型アプリケーションを閉じる
  5. HarborDB と macOS を再起動

高度な最適化技術

大規模テーブルのパーティショニング

-- パーティション化されたテーブルを作成
CREATE TABLE orders_partitioned (
    order_id BIGSERIAL,
    order_date DATE NOT NULL,
    customer_id INT,
    total DECIMAL(10,2)
) PARTITION BY RANGE (order_date);

-- パーティションを作成
CREATE TABLE orders_2024_q1 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

CREATE TABLE orders_2024_q2 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

クエリプランヒント

-- インデックス使用を強制(注意して使用)
SET enable_seqscan = off;

-- 一時的に作業メモリを増加
SET work_mem = '64MB';

-- 特定の結合方法を使用
SET enable_nestloop = off;
SET enable_hashjoin = on;

PGBouncer を使用した接続プーリング

高同時実行性アプリケーションの場合:

  1. PGBouncer をインストール(Homebrew: brew install pgbouncer
  2. トランザクションプーリング用に設定
  3. PGBouncer 経由で HarborDB を接続
  4. 接続再利用統計を監視

パフォーマンステスト

ベンチマーククエリの作成

-- クエリパフォーマンスのテスト
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
  AND status = 'completed'
ORDER BY total DESC
LIMIT 100;

-- 異なるアプローチとの比較
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE status = 'completed'
  AND order_date >= '2024-01-01'
  AND order_date <= '2024-12-31'
ORDER BY total DESC
LIMIT 100;

時間経過による監視

パフォーマンスログテーブルを作成:

CREATE TABLE query_performance_log (
    log_id SERIAL PRIMARY KEY,
    query_hash TEXT,
    execution_time_ms INTEGER,
    row_count INTEGER,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    notes TEXT
);

-- 遅いクエリをログ記録
INSERT INTO query_performance_log
    (query_hash, execution_time_ms, row_count, notes)
SELECT
    md5(query),
    EXTRACT(MILLISECONDS FROM NOW() - query_start),
    result_rows,
    '遅いクエリを検出'
FROM pg_stat_activity
WHERE state = 'active'
  AND NOW() - query_start > INTERVAL '5 seconds';

ベストプラクティスのまとめ

日次ワークフロー

  1. 新しい複雑なクエリは EXPLAIN から始める
  2. データ探索時は LIMIT を使用
  3. 未使用の接続を閉じる
  4. HarborDB を定期的に再起動(週次)
  5. 負荷の高い作業中はシステムリソースを監視

週次メンテナンス

  1. クエリパフォーマンスログを確認
  2. 使用されていないインデックスをチェック
  3. PostgreSQL 統計を更新(ANALYZE)
  4. 一時ファイルをクリーンアップ
  5. パフォーマンス設定をバックアップ

月次レビュー

  1. 遅いクエリパターンを分析
  2. 成長に応じてテーブルパーティショニングを検討
  3. ハードウェア要件を確認
  4. HarborDB と PostgreSQL を更新
  5. パフォーマンス改善を文書化

ヘルプの入手

パフォーマンスチューニングサポート

追加のヘルプが必要な場合:

  1. クエリプランを共有(サポートチームへ)
  2. パフォーマンスログをエクスポート(環境設定 → ログをエクスポート)
  3. システム仕様を含める(macOS バージョン、RAM、ストレージ)
  4. ワークフローと典型的なデータセットサイズを説明

追加リソース

これは役に立ちましたか?

フィードバックを提供してこのドキュメントの改善にご協力ください。