DB性能検証の初期セットアップ

pre-project setup checklist の一項目。「遅くなってから測る手段を作る」のでは遅いため、繋ぎ込みの実装が始まる前に検証手段を用意しておく。エージェントに実装させる場合はとくに、これがないと「動くが遅い」実装が緑のまま通過する。

なぜ初期に要るのか

チェックリスト

1. 本番相当のseedデータがあるか

これがない状態で性能検証を組んでも、すべてノイズになる。 開発用DBの1000行では全件走査が最速なので、正しい判断が「遅い」と判定される。最初に投資すべきはここ。

2. 合格基準がどこから来ているか

「300ms以内」は仕様でも設計でもなく要求の成功基準。エージェントに決めさせると最初の実測値が基準になり、劣化を検出できなくなる。ここは自動化できない。

3. 検証がコマンドとして固定されているか

指示書に「実行計画を確認せよ」と書くだけでは、エージェントが解釈で基準をずらせる。コマンド化すれば基準の改変が差分に出る。

4. 判定の順序と内容

判定は必ず以下の順序で、上位が失敗したら下位を評価しない。

優先判定内容失敗条件にするか
1機能テスト仕様どおり動くこと必須
2クエリ発行回数N+1検出。件数非依存で最も安定する
3効率比返した行数に対し読んだ行数/バッファが異常でないかする
4実行時間(ms)参考値しない(ログ出力のみ)

msを失敗条件にすると誤魔化される。 テストデータを減らす、LIMIT を足す(仕様が変わる)、索引を乱造する(書き込み劣化はこの閾値では見えない)、キャッシュで2回目だけ速くする——どれもmsは改善する。回数と比率は比なので誤魔化せない。

5. アサートしてはいけないもの

計画の形は実装詳細。DBバージョン・統計・データ件数・コストパラメータで変わる。件数が少なければ全件走査を選ぶのが正しいので、このテストは「プランナが正しく判断したとき赤くなる」。宣言的インターフェースのテストで実装詳細を固定している状態。

代わりに安定するもの:

6. 修正ループの上限とエスカレーション

「索引を足せば直る」ケースと「データモデルが間違っている」ケースを、実行計画から区別することはできない。後者を自動修正させると、根本原因の上に索引が積み上がる。

7. 実行レーンの分離

Red-Green-Refactorの内側は「速く・決定的に」が生命線。性能は環境依存で遅いので、内側に置くと開発が止まる。

8. 本番側の恒常観測

広く見つける(定点観測)一点を深く見る(虫眼鏡)
PostgreSQLpg_stat_statements / auto_explainEXPLAIN (ANALYZE, BUFFERS)
MongoDBDatabase Profilerexplain("executionStats")
Elasticsearchslow log?profile=true

Elasticsearch固有の注意

ESをデータストアに使う場合、上記の枠組みがそのままは適用できない。

フィルタキャッシュ・リクエストキャッシュにより2回目から速くなる。ウォームアップして複数回実行し中央値を取らないと安定しない。RDBMSより「msが揺れる/誤魔化される」度合いが強い。

補足として、Query DSL側にはコストベースのプランナが存在しない(転置インデックスという単一経路のため選択が発生しない)。「効率比」に相当する指標がprofile出力から素直に取れないので、構造的な指標(書き換え時間・リクエスト回数・対象shard数)に寄せる。

なお _explain APIは1ドキュメントのスコア内訳を出すもので、性能診断用ではない。名前が紛らわしい。

関連