Query-Sense — PostgreSQL EXPLAIN 解析ツール

Data

概要

Query-SenseはPostgreSQLのEXPLAIN / EXPLAIN ANALYZE出力を解析して、クエリ実行計画の問題点を検出し、実行可能な修正提案を返すツールです。CLIで動作し、JSON形式のEXPLAIN結果を渡すと、行数推定の誤差、シーケンシャルスキャンの検出、インデックス作成の提案、ANALYZEの推奨などを階層的にレポートします。開発者やDBAがボトルネックを素早く見つけ、優先度の高い対策を実行できるように設計されており、軽量なPythonパッケージとして配布されています。READMEの例では、1つのインデックスで2.3秒→0.04秒など大幅な改善を示すサンプルもあります。

GitHub

リポジトリの統計情報

  • スター数: 18
  • フォーク数: 0
  • ウォッチャー数: 18
  • コミット数: 13
  • ファイル数: 7
  • メインの言語: Python

主な特徴

  • EXPLAIN / EXPLAIN ANALYZE(JSON)を解析して問題点を抽出し、わかりやすいメッセージと対処法を提示。
  • 行推定誤差やシーケンシャルスキャン、統計情報不足(ANALYZE)やインデックス欠如を識別。
  • CLIツールとして簡単に導入可能(pip install querysense)、CIや運用スクリプトに組み込みやすい。
  • 出力は重要度(CRITICAL, WARNING など)で分類され、優先対応が明確。

技術的なポイント

Query-Senseは主にPostgreSQLのEXPLAIN系出力(JSON形式)を入力として解析する点が技術的核です。ツールは実行計画ツリーを再帰的に走査し、各ノードの推定行数(plannerの推定値)と実際のスキャン行数(EXPLAIN ANALYZEで取得可能な実行統計)を比較して、行推定誤差を定量化します。大きな差が検出されると、推定誤差の原因として統計情報の古さ(ANALYZE不足)や結合順序・選択性の誤りを推定し、優先度付きで修復アクション(ANALYZEの実行、インデックス作成など)を提示します。

また、Seq Scanノードの検出では、スキャン対象テーブルの実行コストや行数を基に「インデックスで改善可能か」を推定し、想定される速度改善倍率(例: 57x)を提示します。インデックス提案は単純なカラム名と想定DDLを示す形で、実運用での導入前に手動検討が可能です。設計上は外部に接続してDBを操作するのではなく、EXPLAIN出力だけで推奨を生成するため、非侵襲でCI/CDやアラートパイプラインに組み込みやすくなっています。

実装はPythonパッケージ化され、CLIコマンド(querysense analyze)を提供。依存管理はpyproject.tomlで行われており、軽量で単機能を志向したコード構成のため、カスタマイズや拡張(新しいルールの追加、独自のコストモデル適用)も比較的容易です。READMEにある通り、典型的なワークフローはEXPLAIN ANALYZEのJSON出力を保存してからそれを解析する流れで、監視や自動診断のユースケースに適しています。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • README.md: file
  • pyproject.toml: file
  • query.png: file
  • scripts: dir

…他 2 ファイル

(README抜粋)

QuerySense

Analyze PostgreSQL EXPLAIN plans and get actionable performance fixes.

pip install querysense

```bash
$ querysense analyze slow_query.json

[CRITICAL] Row estimation error on orders (5,000x off)
   Planner estimated 50 rows, actually scanned 250,000.
   Fix: ANALYZE orders;

[WARNING] Sequential scan on orders (250,000 rows)
   Estimated improvement: 57x faster
   Fix: CREATE INDEX idx_orders_status ON orders(status);

QuerySense: 2.3s → 0.04s with one index

まとめ

EXPLAIN出力のみで実用的な改善案を出す、導入が容易なPostgreSQLパフォーマンス解析ツールです。(約50字)