【入門編】 ヒープページレイアウト – PostgreSQL

やあ!今日もデータベースの世界へようこそ。

PostgreSQLを触っていると、「結局データって、ディスクの上でどう並んでいるの?」って疑問に思うことはありませんか? SQLのクエリを叩くのは簡単だけど、その裏側にある「データの住まい」を想像してみると、パフォーマンスの悩みが少しだけ解決の糸口に見えてくるかもしれません。

今日は、PostgreSQLの「ヒープページ(データページ)」という、言わばデータの「お部屋」の中身を覗いてみましょう。

—

1. ページは「巨大なマンションの1フロア」だと思おう

PostgreSQLでは、データを格納する最小単位を「8KBのページ」と呼んでいます。これが1つのマンションのフロアみたいなもの。このフロアの中に、いろんなデータ(タプルと言います)がぎっしり詰まっているわけです。

では、このフロアの中はどうなっているんでしょう? ざっくり分けると、大きく4つのエリアに分かれています。

  • ページヘッダ: フロアの管理人室。ここには「このフロアのどこに空きがあるか」「誰が最後に修正したか」といった管理情報が書かれています。
  • アイテムポインタ: 住民名簿。各データがどこにあるかを指し示す「住所」のリストです。
  • 空き領域: まだ誰も住んでいない、まっさらな空間。
  • タプルデータ: 実際に住んでいる住民(データ)。

2. 不思議なルール「下から上に詰まっていく」

ここからが少し面白いところ。実はこのフロア、「住民名簿(ポインタ)」は入り口(上側)から書き込まれ、「住民(データ)」は一番奥(下側)から書き込まれていくんです。

どういうことかと言うと、新しいデータが増えるたびに、ポインタは上から下へ、データは下から上へと向かって、お互いに歩み寄っていくようなイメージ。

「なぜそんな面倒なことを?」と思いますよね。実はこれ、「効率よく隙間を活用するため」なんです。
空き領域を常に真ん中に集めておくことで、新しいデータが入ってきたときに「どこに入れようかな?」と迷う時間を最小限にしているんですね。賢いですよね!

3. なぜ「名簿(ポインタ)」が必要なの?

あなたは「住民名簿」の役割に気づきましたか?
もしデータがフロアの中で移動したり、削除されたりしたとき、いちいち住所を書き換えていたら大変ですよね。

PostgreSQLは、データの場所を直接指定するのではなく、「名簿の番号」を介してデータを見に行きます。つまり、部屋の場所(データ)が多少動いても、名簿の番号さえ変わらなければ、システムは混乱しないというわけ。この仕組みのおかげで、PostgreSQLは非常に柔軟にデータを管理できているんです。

4. 「ゴミ屋敷」になっちゃうこともある?

データが更新されたり削除されたりすると、フロアの中に「ポッカリ空いた穴(デッドタプル)」が生まれます。

そう、これが例の「VACUUM(バキューム)」の出番です。
掃除機をかけて、不要になった住民を退去させ、空きスペースを回収してあげる。これをしないと、フロアは穴だらけになって、新しい住民が入るスペースがなくなってしまいます。

「なぜPostgreSQLは自動で掃除してくれないの?」なんて思われがちですが、この「掃除するタイミング」を自分で賢く制御できるのも、PostgreSQLが長年愛されている理由の一つなんですよ。

—

まとめ:イメージを持つことが、チューニングの第一歩

どうでしたか?
「ヒープページ」なんて聞くと難しそうですけど、「8KBのフロアに、ポインタとデータが背中合わせで住んでいる」と考えると、なんだか少し身近に感じられませんか?

  • ヘッダは管理人のメモ
  • ポインタは住所リスト
  • データは住民
  • VACUUMは掃除のおじさん

この光景が脳内に浮かぶようになれば、あなたはもう立派なデータベースエンジニアの卵です。

もし次に「インデックスが効かないな?」とか「最近遅いな?」なんて思ったときは、このマンションのフロアを想像してみてください。「あ、もしかして掃除が必要かな?」なんて、原因に気づけるようになるかもしれません。

それでは、また次回のブログでお会いしましょう!Happy Querying!

コメント

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