【入門編】 ビットマップヒープスキャン – PostgreSQL

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

普段、PostgreSQLを触っていて「なんだかクエリが遅いな……」と悩んだことはありませんか?そんな時、実行計画(EXPLAINの結果)を覗くと、「Bitmap Heap Scan」という耳慣れない単語が出てくることがありますよね。

今日は、この「ビットマップヒープスキャン」という、ちょっと難しそうな名前のテクニックを、身近な例え話で攻略してみましょう。

—

膨大な書類から特定のデータを探すとき

想像してみてください。あなたは巨大な図書館の司書さんです。
ある日、お客さんから「『2023年』に発行された『技術書』を全部持ってきて!」と頼まれました。

この時、あなたならどう探しますか?

1. インデックス・スキャン(図書館の検索カード)

図書館には、本を効率よく探すための「索引カード(インデックス)」がありますよね。
もし、探す本が1冊だけなら、カードを見て棚の場所へ行き、本を1冊ずつ取りに行くのが一番早いです。これは「Index Scan」といって、非常に効率的です。

2. ビットマップ・スキャン(地図に印をつける作戦)

でも、もし「2023年の技術書」が100冊も200冊もあったらどうでしょう?
カードを見ては棚へ行き、戻ってきては次のカードを見て……と繰り返すと、図書館の中を何度も往復して、足が棒になってしまいますよね。

ここで登場するのが「ビットマップヒープスキャン」です。

1. まずはメモ帳を用意する: まずは本を探しに行く前に、一旦すべてのカードをチェックして、「どの棚に目的の本があるか」をメモ帳(ビットマップ)に記録します。
2. 地図を完成させる: 「あそこにもある、ここにもある」と、目的の本がある場所を地図のように塗りつぶしていきます。
3. 効率的なルートで一気に回収: メモ帳が完成したら、一番歩数が少なくて済む効率的なルートを考えて、一気に棚を回って本を回収します。

こうすれば、行ったり来たりする無駄な時間を極限まで減らせますよね。PostgreSQLがやっているのも、まさにこれと同じことなんです。

—

なぜ「ビットマップ」と呼ぶの?

「ビットマップ」という名前、少し不思議に聞こえるかもしれませんね。

これは、コンピュータの内部で「0」と「1」のリストを作っているからです。
「1番目の棚にはある(1)」「2番目の棚にはない(0)」「3番目の棚にもある(1)」といった具合に、本がある場所をスイッチのON/OFFのように記録しているんです。この「地図」を読み解きながら、効率よくテーブル(本棚)からデータ(本)を拾い上げているんですね。

—

どんな時にこの手法が使われるの?

ビットマップヒープスキャンが選ばれるのは、たいていこんな時です。

  • 「そこそこ多い」件数を検索するとき: インデックススキャンでは時間がかかりすぎるけれど、かといって全部のデータを順番に見る(シーケンシャルスキャン)ほどではない、という「中くらいの量」の時。
  • 複数の条件を組み合わせたとき: 「2023年」かつ「技術書」というように、複数のインデックスを組み合わせて地図を作る必要があるとき。

PostgreSQLのオプティマイザ(司令塔)は、とても優秀です。「今は全部を順番に見るより、ビットマップを作ってから取りに行く方が速いな!」と判断した時に、この手法をそっと選んでくれているんです。

—

まとめ:怖がる必要はありません!

「Bitmap Heap Scan」と表示されると、「何か悪いことしてるんじゃないか?」と不安に思う方もいるかもしれません。

でも、安心してください。これは「大量のデータを効率よく集めるための、PostgreSQLの知恵」なんです。もしこの表示が出ていたら、「ああ、効率を考えてルートを最適化してくれているんだな」と、温かい目で見守ってあげてください。

もし、それでもクエリが遅くて困っているなら、それはインデックスの貼り方や、検索条件の見直しのサインかもしれません。

データベースのチューニングは、まるでパズルを解くような楽しさがあります。ぜひ、これからも楽しみながら学んでいってくださいね!

それでは、また次回のブログでお会いしましょう。ハッピー・クエリライフを!

コメント

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