こんにちは!データベースエンジニアとして日々、クエリの海を泳いでいる管理人です。
皆さんは、PostgreSQLを使っていて「あれ、なんでこんなに検索が遅いんだろう?」と悩んだことはありませんか?実はその原因、データベースが「勘違い」をしているからかもしれません。
今日は、そんなデータベースの「勘違い」を正してあげるためのちょっと便利な武器、`pg_stats_ext`という機能についてお話ししますね。
—
データベースは「目隠し」をして走っている?
想像してみてください。あなたは巨大な図書館の司書さんです。誰かに「『料理』に関する本で、『イタリアン』のものを探して!」と頼まれたとします。
もしあなたが、「料理の本」と「イタリアンの本」がそれぞれ何冊あるかしか知らなかったら、どうやって探しますか?きっと、全部の棚を端から端まで見ていくことになりますよね。でも、もしあなたが「イタリアンの本は、全部料理のコーナーにあるよ」という「相関関係(セットの情報)」を知っていたら、迷わずそのコーナーに直行できますよね。
実は、PostgreSQLもこれと同じなんです。個別のデータの数は知っていても、「この列とあの列はセットで動くことが多い」という情報の組み合わせまでは、放っておくと気づいてくれないことがあるんです。
そこで登場するのが「拡張統計情報」
PostgreSQLは、普段はとても優秀な働き者ですが、複数の列を組み合わせた条件が苦手です。「市」と「郵便番号」みたいに、密接に関係しているデータでも、別々のものとしてバラバラに考えちゃうことがあるんですね。
そこで使うのが「拡張統計情報」という仕組みです。
「この列とこの列は仲良しなんだよ!」とデータベースに教えてあげると、データベースは「おっ、そうだったのか!ならもっと効率的な近道があるな!」と気づいて、検索のスピードを劇的にアップさせてくれるんです。
そして、その「どんな仲良し情報(統計情報)を登録したっけ?」を確認できるのが、今回紹介する `pg_stats_ext` というシステムビューというわけです。
—
`pg_stats_ext` をのぞいてみよう
使い方はとっても簡単。PostgreSQLに対して、こんなふうに尋ねるだけです。
SELECT FROM pg_stats_ext;
これを実行すると、あなたがデータベースに教えた「ヒント」の一覧がずらっと出てきます。
- どのテーブルにヒントを設定したか
- どの列とどの列を「セット」として認識させているか
- どんな種類の関係性(相関など)を調べているか
といった情報が詰まっています。
「最近、クエリが遅いな……」と思ったときに、このビューを確認してみてください。もし、密接に関係している列なのにここに名前が載っていなかったら、それが「データベースが勘違いをしている」サインかもしれません。
まとめ:データベースと仲良くなろう
データベースのチューニングって、なんだか難しそうで怖いイメージがあるかもしれません。でも、結局は「データベースにどれだけ正しいヒントを与えてあげられるか」という、ちょっとしたコミュニケーションなんです。
`pg_stats_ext` は、そのコミュニケーションを円滑にするための「確認用ノート」みたいなもの。ぜひ、今のデータベースがどんなヒントを持っているのか、一度のぞいてみてください。
「あ、ここに足りないヒントがあった!」と気づくことができれば、それが検索速度アップの第一歩になりますよ。
それでは、素敵なデータベースライフを!また次回の記事でお会いしましょう。
コメント