こんにちは!データベースの世界へようこそ。
普段、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の知恵」なんです。もしこの表示が出ていたら、「ああ、効率を考えてルートを最適化してくれているんだな」と、温かい目で見守ってあげてください。
もし、それでもクエリが遅くて困っているなら、それはインデックスの貼り方や、検索条件の見直しのサインかもしれません。
データベースのチューニングは、まるでパズルを解くような楽しさがあります。ぜひ、これからも楽しみながら学んでいってくださいね!
それでは、また次回のブログでお会いしましょう。ハッピー・クエリライフを!
コメント