【入門編】 EXPLAIN BUFFERS – PostgreSQL

「なぜかサイトが重い…」を解決する、PostgreSQLの魔法のコマンド『EXPLAIN BUFFERS』の話

こんにちは!データベースエンジニアとして日々PostgreSQLと格闘していると、時々こんな相談を受けるんです。

「なんだか最近、アプリの動きがモタつく気がするんです。コードは間違っていないはずなのに、どうしてでしょう?」

そんなとき、僕が真っ先に使うのが『EXPLAIN BUFFERS』という機能です。名前だけ聞くとちょっと難しそうですよね。でも、実はこれ、データベースが「どこで手間取っているか」を教えてくれる、すごく優秀な名探偵なんですよ。

今日は、専門用語を抜きにして、この「魔法のコマンド」が何を教えてくれるのか、一緒に見ていきましょう。

—

「本棚」で例えると、すべてが繋がります

データベースを「巨大な図書館」だと想像してみてください。あなたが知りたいデータは、その図書館の中にある「本」に書かれています。

通常、PostgreSQLはデータを探すとき、こんな手順を踏みます。

1. まずは手元(メモリ)を確認: さっき読んだ本が机の上に置かれていないかな?(これを「ヒット」と呼びます)
2. なければ倉庫(ディスク)へ: 机になければ、わざわざ遠くの倉庫まで取りに行かなきゃいけません。(これを「読み込み」と呼びます)

この「倉庫まで取りに行く」という作業、実はめちゃくちゃ時間がかかるんです。人間でいえば、立ち上がって、階段を登って、重い本を探しに行くようなもの。これが頻繁に発生すると、システムは一気に重くなってしまいますよね。

『EXPLAIN BUFFERS』は「レシート」みたいなもの

『EXPLAIN BUFFERS』を実行すると、PostgreSQLはこんな感じの「作業報告書(レシート)」を返してくれます。

  • Shared Hit(共有ヒット): 「机の上に置いてあったから、すぐ読めたよ!」(高速!)
  • Read(読み込み): 「わざわざ倉庫まで取りに行ったよ…」(低速!)

つまり、このコマンドを打つだけで、「あ、この処理は倉庫まで何回も往復しているから遅いんだな」ということが一発で分かるんです。

どうやって使うの?

使い方はとっても簡単です。普段実行しているSQL文の先頭に、おまじないのように `EXPLAIN (ANALYZE, BUFFERS)` を付けるだけ。

EXPLAIN (ANALYZE, BUFFERS)
SELECT FROM users WHERE status = ‘active’;

これだけで、PostgreSQLが「このクエリを処理するのに、メモリをどれくらい使って、ディスクから何回データを引っ張ってきたか」を事細かに教えてくれます。

「読み込み(Read)」が多いときはどうする?

もし結果を見て、「Read(倉庫への往復)が多すぎる!」と分かったら、そこが改善のチャンスです。

  • インデックスを貼る: 図書館の「索引」を作って、どこに本があるかすぐ分かるようにする。
  • メモリを増やす: 机を大きくして、より多くの本を手元に置けるようにする。

原因が分かれば、対策は自然と見えてきます。「なんとなく重いなあ」と悩んでいた時間が、このコマンド一つで「あ、ここを直せばいいのか!」という確信に変わる瞬間、エンジニアとして最高に気持ちいい瞬間なんですよ。

—

最後に:怖がらなくて大丈夫!

データベースのパフォーマンスチューニングと聞くと、「なんだか難しそうだし、壊しちゃいそう…」と不安になるかもしれません。でも大丈夫。`EXPLAIN`は、あくまで「今の状態を教えてくれるだけ」の優しいツールです。データを書き換えたりすることはないので、安心して覗いてみてください。

「自分の書いたSQLが、データベースの中でどんな旅をしているのか」。それを覗き見するだけで、データベースと少し仲良くなれたような気分になれますよ。

皆さんのシステムが、今日もサクサク快適に動きますように!また次回のブログでお会いしましょう。

コメント

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