「クエリが遅い」。エンジニアなら誰もが一度は頭を抱える瞬間ですよね。
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` を取るところから始めてみてください。プランナが考えている「思考プロセス」を読み解くのは、パズルみたいで案外楽しいものですよ。
それでは、良いチューニングライフを!
コメント