こんにちは!データベースの世界へようこそ。
普段、何気なく使っているデータベース。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!
コメント