「なぜか検索が遅い…」を解決する第一歩!PostgreSQLの『健康診断カルテ』を覗いてみよう
こんにちは!データベースエンジニアとして日々PostgreSQLと格闘している私です。
みなさんは、データベースを使っていて「最初はサクサク動いていたのに、データが増えた途端に急に重くなった……」なんて経験はありませんか?まるで、最初は身軽だったカバンにどんどん荷物を詰め込んで、気づけば歩くのもやっと、みたいな状態ですね。
実はPostgreSQLには、そんな「なぜ重いのか?」という謎を解くための『健康診断カルテ』のような場所があるんです。それが今回紹介する`pg_stats`というビューです。
専門用語はなるべく抜きにして、一緒に見ていきましょう!
—
プランナは「名探偵」ではなく「直感に頼る人」?
PostgreSQLがSQLを実行するとき、裏側では「プランナ」という司令塔が「どの順番でデータを探すのが一番速いか?」を考えています。
でも、このプランナは超能力者ではありません。彼が頼りにしているのは、「過去のデータがどんな分布をしていたか」というメモ(統計情報)だけなんです。
- 「このテーブルには、Aという値が100個くらいあるはずだな」
- 「Bという値はほとんど入っていないから、探すときは後回しでいいか」
といったメモを元に作戦を立てます。もしこのメモが古かったり、実態とズレていたりすると、プランナはとんでもない勘違いをして、効率の悪い探し方をしてしまうんです。
`pg_stats` は、プランナの「脳内のメモ帳」
このプランナが頼りにしているメモの中身を覗けるのが、`pg_stats`というビューです。
「テーブルの中にどんなデータが、どれくらいの割合で入っているか」という情報が、このカルテには細かく書かれています。試しに、ターミナルでこんなふうに覗いてみてください。
SELECT tablename, attname, n_distinct, most_common_vals
FROM pg_stats
WHERE tablename = ‘あなたのテーブル名’;
これを見ると、PostgreSQLがあなたのデータをどう見ているかが一目瞭然になります。
- n_distinct: 「この列には、大体これくらいの種類のデータが入っているよ」という目安。
- most_common_vals: 「よく登場する値はこれだよ。これが多いから気をつけてね」というヒント。
もしかして、メモが古くなっていませんか?
もし、検索が遅いと感じたなら、まずはこの`pg_stats`を見てみてください。「あれ?最近データをごっそり入れたのに、この数字が古いままじゃない?」ということに気づくかもしれません。
PostgreSQLには`ANALYZE`というコマンドがあるのですが、これは「最新のデータを調べて、メモ帳を更新して!」とお願いするコマンドです。
たまに「最近動きが鈍いな」と思ったら、一度`ANALYZE`を実行して、プランナのメモ帳を最新の状態にアップデートしてあげてください。これだけで、嘘のように検索速度が改善することも珍しくないんですよ。
—
今日のまとめ:データベースを「観察」する楽しさ
データベースのチューニングと聞くと、「難しいインデックスを貼るんでしょ?」と構えてしまうかもしれません。でも、まずは「今、PostgreSQLはどうやってデータを見ているんだろう?」と、その視点を覗いてみることが一番の近道です。
`pg_stats`は、いわばデータベースの健康状態を知るための大切なカルテです。
「今日はどんなデータが入っているのかな?」と、たまにこのカルテを覗いてあげることで、あなたとデータベースの距離はグッと縮まるはずです。ぜひ、怖がらずに一度`SELECT`してみてくださいね!
それでは、また次回の記事でお会いしましょう。ハッピーなデータベースライフを!
コメント