【入門編】 可視性マップ(Visibility Map) – PostgreSQL

こんにちは!データベースの世界へようこそ。

普段、PostgreSQLを触っていると「インデックスを使っているのに、なんでこんなに検索が遅いんだろう?」と悩むこと、ありませんか?

実は、その謎を解く鍵の一つに「可視性マップ(Visibility Map)」という、ちょっと地味だけど最高に優秀な「名脇役」がいるんです。今日は、この仕組みを日常の風景に例えて、こっそりお話ししますね。

—

図書館の「貸出カード」をイメージしてみて

想像してみてください。あなたは巨大な図書館の司書さんです。
本棚には何万冊もの本が並んでいますが、その中には「誰かに貸出中」のものもあれば、「返却されて棚に戻っている」ものもありますよね。

PostgreSQLにとって、テーブルのデータ(タプル)を確認することは、まさにこの本を探す作業と同じです。

通常、PostgreSQLは「このデータは今、誰から見ても有効かな?」と確認するために、わざわざ本の中身(データの詳細部分)をチラッと覗きに行かないといけません。これを繰り返すと、本棚を行ったり来たりするだけでもうクタクタ……。これが「データを探すのが遅い」原因の一つなんです。

そこで登場するのが「可視性マップ」!

この問題を解決するために、図書館の入り口に「この棚の本は、全部誰にも貸し出されていなくて、いつでも読み放題だよ!」と書かれた掲示板を置くことにしました。これが「可視性マップ」です。

可視性マップの役割はいたってシンプル。
「このページの中身は、誰から見ても最新で、文句なしに有効だよ!」という情報を、ビット(0か1)という簡単な印で記録しているんです。

  • 「1」なら: 「全部読み放題!中身を確認する必要なし!」
  • 「0」なら: 「まだちょっと確認が必要かも……」

これがあるおかげで、わざわざ本棚の中身を全部チェックしに行かなくても、「掲示板に『1』って書いてあるから、このページは全部正解だ!」と判断できるわけです。

なぜこれが「インデックスオンリースキャン」を爆速にするの?

PostgreSQLには「インデックスオンリースキャン」という、テーブル本体を見に行かずにインデックスだけで検索を終わらせる魔法のような機能があります。

でも、インデックスの情報だけだと「このデータ、まだ有効かな?」という正確な状態までは分かりません。そこで可視性マップの出番です。

1. インデックスでデータの場所を探す。
2. 可視性マップを見て「あ、このページは全部有効だ(ビットが立ってる)!」と確信する。
3. テーブル本体を見に行かずに、その場で結果を返す!

どうですか? テーブル本体という「重い本棚」まで歩いていく手間を省ける分、驚くほど速くなると思いませんか?

まとめ:名脇役を味方につけよう

可視性マップは、私たちが意識しなくてもデータベースが裏側でせっせと書き換えてくれている「時短の知恵」です。

  • 「ページ内のデータが全トランザクションから見て有効であること」を記録している。
  • おかげで、本体データを見に行く手間が省ける。
  • 結果として、インデックスオンリースキャンが爆速になる。

こうして仕組みを知ると、PostgreSQLというデータベースが、いかに効率よく仕事をするために工夫を凝らしているか、少し愛着が湧いてきませんか?

もし皆さんが「最近クエリが遅いな」と感じたら、それはもしかするとこの掲示板(可視性マップ)がうまく更新されていないのかもしれません。そんな時は、`VACUUM` という「お掃除コマンド」を思い出してあげてくださいね。

それでは、また次回の記事でお会いしましょう!データベースライフを楽しんでくださいね。

コメント

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