【入門編】 タプルヘッダ構造 – PostgreSQL

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

普段、何気なく使っているデータベース。SQLを叩けばデータが出てくるけれど、その裏側で「データがどんな姿で保存されているか」なんて、あまり考えたことはないですよね。

実は、PostgreSQLの「行データ(タプル)」には、私たちが入力したデータ以外に、「身分証明書」のようなヘッダ情報がこっそり付いているんです。今日は、このちょっとマニアックだけど面白い「タプルヘッダ」の秘密を、皆さんと一緒に解き明かしていきましょう。

—

タプルヘッダって、何者?

想像してみてください。ある本棚に「重要書類」が並んでいるとします。その書類の表紙に、ポストイットで「いつ作成されたか」「誰が書き換えたか」「今有効なのか」といったメモがペタペタ貼ってある……そんなイメージです。

PostgreSQLでは、このポストイットの部分を「タプルヘッダ」と呼びます。これがないと、データベースは「このデータ、今使っていいの? もう消したやつだっけ?」と大混乱に陥ってしまいます。

具体的に、どんなメモが貼られているのか見ていきましょう。

—

1. xmin と xmax:データの「賞味期限」のスタンプ

一番重要なのがこの二つ。「いつ生まれて、いつ消えたか」を管理する、いわば「有効期間」のスタンプです。

  • xmin(作成者IDのようなもの): 「どのトランザクション(作業グループ)がこのデータを作ったか」が書かれています。これが書かれた瞬間、このデータは世の中にデビューします。
  • xmax(消去予約日): 「どのトランザクションがこのデータを消そうとしたか」が記録されます。まだ消されていなければ空っぽです。

PostgreSQLは、このスタンプを見て「今の自分より若いデータは見えるけど、消去予約があるデータは見えないな」と判断しているんです。これこそが、PostgreSQLの誇るMVCC(多版同時実行制御)の正体ですね。

2. cmin と cmax:現場の「作業指示書」

こちらは少し細かい情報です。ひとつのトランザクションの中で、何度もデータを出し入れする時の「順番」を記録しています。

  • 「同じ作業グループ内で、先にAを書き込んで、次にBを書き込んだよね」といった「コマンドの実行順序」を管理しています。現場の指揮官が「作業手順書」を手に持っているようなものですね。

3. t_ctid:次の行き先を示す「案内板」

これは面白いですよ。`t_ctid` は、「このデータの最新版はどこにあるか?」を指し示すポインタです。

もしデータを「更新」した場合、PostgreSQLは元の場所を書き換えるのではなく、別の場所に新しいデータを書き込みます。その際、古いデータの方に「最新版はこっちだよ!」と新しい住所を書いておくんです。まるで、引っ越し先を教えてくれる転送届のようですね。

—

なぜこんなに複雑なの?

「ただデータを保存するだけでいいじゃない!」と思いますよね。でも、PostgreSQLは「読み込み(SELECT)」と「書き込み(UPDATE/DELETE)」が同時に行われても、お互いを邪魔しないように工夫しているんです。

もし、誰かがデータを読んでいる最中に別の人が書き換えてしまったら? 読み込んでいる人は、古い情報と新しい情報が混ざった「中途半端なデータ」を見てしまうかもしれません。

タプルヘッダという「身分証明書」があるおかげで、PostgreSQLはこう言えるんです。
「あなたはさっきの時点のデータを見てね。私は今、新しいデータを作っているから、もう少しまってて!」

—

最後に:データベースは「チームプレー」

こうして見ると、一行のデータの中に、これほど多くの「管理情報」が詰め込まれていることに驚きませんか?

私たちが何気なく `SELECT FROM users;` と打っている裏側では、PostgreSQLがタプルヘッダを一生懸命読み取り、正しいデータだけを選別して届けてくれているんです。

「データはただの箱に入っているわけじゃないんだな。管理者が常にチェックしているんだな」

そう思うと、データベースが少しだけ身近に、そして愛おしく感じられませんか?もし興味があれば、今度PostgreSQLを触るときに、「今、このデータにはどんなスタンプが押されているのかな?」と想像してみてくださいね。

それでは、また次回の記事でお会いしましょう!Happy Hacking!

コメント

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