【実務・中級編】 クエリプランナ – PostgreSQL

「クエリが遅い」。エンジニアなら誰もが一度は頭を抱える瞬間ですよね。

DBのパフォーマンスチューニングにおいて、インデックスを闇雲に張ったり、とりあえず`VACUUM`を叩いたりして「運良く速くなる」のを待っていませんか?もしそうなら、今日から少しだけアプローチを変えてみましょう。

PostgreSQLの心臓部、クエリプランナ(Query Planner)と仲良くなることが、高速化への最短ルートです。

—

クエリプランナは「優秀なカーナビ」だ

まず、PostgreSQLがSQLをどう処理しているか、イメージしてみてください。僕らはただ「このデータを取ってきて」と命令するだけですが、DB内部ではプランナが何万通りもの実行経路をシミュレーションしています。

プランナは、「コストベース最適化(Cost-Based Optimization)」という手法をとります。
テーブルの行数、インデックスの有無、データの分布(統計情報)を基に、「この経路ならこのくらいのコストで済むはずだ」という予測を立て、最も効率的と思われる実行計画(プラン)を選び出すんです。

でも、このプランナ、意外と嘘をつきます。 いや、嘘というか「見えている情報が古かったり足りなかったりする」と、平気でとんでもない遠回りを選択するんです。

まずは自分の目で「実行計画」を覗こう

チューニングの第一歩は、`EXPLAIN ANALYZE` を叩くこと。これを知らずにチューニングするのは、目隠しで車の修理をするようなものです。

EXPLAIN ANALYZE
SELECT FROM users WHERE status = ‘active’ AND created_at > ‘2023-01-01’;

出力結果を見ると、こんな情報が並びます。

  • Seq Scan (Sequential Scan): 全件フルスキャン。これが大量のテーブルで出ると要注意。
  • Index Scan: インデックスを使った検索。速いけど、場合によってはテーブル参照のコストが高いことも。
  • Hash Join / Nested Loop: 結合のアルゴリズム。データ量によって最適なものが変わる。

ここで注目してほしいのが、「Actual Time」と「Cost」の乖離です。

「Cost」と「Actual Time」の乖離に注目せよ

現場で一番よくある悲劇は、プランナが「このクエリは一瞬で終わるはずだ(低いコスト)」と踏んでいるのに、実際には数秒かかっているケースです。

なぜこれが起きるか? 犯人は大抵「統計情報」です。
PostgreSQLは、テーブルの統計情報を元にコストを計算します。もし`ANALYZE`コマンドを長期間実行していないと、テーブルの中身が変わっているのにプランナは「昔の薄いテーブル」だと思い込み、間違ったプランを選択し続けます。

先輩からのアドバイス:
「なんか遅いな?」と思ったら、まずは対象テーブルの統計情報を最新にしましょう。

ANALYZE users;

これだけで解決するケースが驚くほど多いです。おまじないのように見えますが、これはDBにとって「現在の地図を更新する」という極めて重要な作業なんです。

プランナを「誘導」するテクニック

統計情報も最新なのに、どうしても遅い。そんな時は、プランナにヒントを与える必要があります。

1. インデックスの有効活用

もしプランナがインデックスを使ってくれないなら、クエリの書き方を工夫します。例えば、インデックス列に関数をかけていませんか?

— これだとインデックスが効かない(関数インデックスが必要)
WHERE DATE(created_at) = ‘2023-01-01’

— こう書けばプランナはインデックスを検討してくれる
WHERE created_at >= ‘2023-01-01’ AND created_at < '2023-01-02'

2. 結合順序の考慮

結合するテーブルが増えると、プランナは迷子になりがちです。`JOIN`の順序を変えるだけで劇的に速くなることがあります。また、`EXPLAIN`の結果を見て、Nested Loopが非効率な場所で発生しているなら、インデックスの追加を検討するサインです。

最後に:完璧を求めすぎない

クエリチューニングをしていると、つい「0.1msでも速く!」と最適化に没頭しがちです。でも、現実的な現場では「十分に速い(=ユーザーがストレスを感じない)」ところで手を打つのがエンジニアの美徳です。

プランナは完璧なAIではありません。でも、僕たちが「テーブルの特性」や「インデックスの意図」を正しく伝えてやれば、驚くほど賢いパフォーマンスを発揮してくれます。

まずは明日、一番重いクエリの `EXPLAIN ANALYZE` を取るところから始めてみてください。プランナが考えている「思考プロセス」を読み解くのは、パズルみたいで案外楽しいものですよ。

それでは、良いチューニングライフを!

コメント

タイトルとURLをコピーしました