「住所」を知らずに「部屋番号」で直接ノックする魔法?TIDスキャンの話
こんにちは!データベースの世界へようこそ。
普段、私たちがデータベースからデータを取り出すとき、例えば「会員番号が123番の人を教えて!」と検索しますよね。
これって、巨大な図書館で「会員番号123番のカードを貸し出してください」と司書さんに頼むようなものなんです。司書さんは、まずカタログ(インデックス)を見て、「えーっと、123番は…あっちの棚の3段目ですね」と探しに行ってくれます。
これでも十分速いのですが、もし、「その本は、今この瞬間に、この棚の、左から5番目に置いてある」という正確な場所を最初から知っていたらどうでしょう?
今回は、PostgreSQLが持っている「最強の近道」、TIDスキャンについてお話しします。
—
TIDスキャンってなに?
PostgreSQLには、テーブルの中にあるすべてのデータに、「物理的な住所(ctid)」というIDが割り振られています。
例えるなら、巨大なマンションの「部屋番号」のようなものです。
通常、私たちは名前や会員番号で検索しますが、TIDスキャンは「このデータは、〇〇号室にあります!」とピンポイントで指定して直接ドアを叩くような手法なんです。
普通に検索する(インデックスを使う)場合:
1. 目録(インデックス)を見る
2. 目録に書かれた場所に行く
3. 目的のデータを見つける
TIDスキャンの場合:
1. 「そのデータ、〇〇号室にあるよ」と場所を直接指定する
2. そこに直行して回収する
どうですか?手順が圧倒的に少ないですよね。これが、TIDスキャンがデータベースの世界で「最速」と言われる理由です。
—
なぜ普段使わないの?
「そんなに速いなら、全部これで検索すればいいじゃない!」と思いますよね。でも、これにはちょっとした落とし穴があるんです。
実は、この「ctid(部屋番号)」、データが更新されるとコロコロ変わっちゃうんです。
例えば、テーブルの中でデータを修正したり、整理整頓(バキューム処理など)したりすると、データは別の場所に引っ越してしまいます。「さっきまで301号室にいたはずなのに、戻ってきたら402号室に移動してた!」なんてことが日常茶飯事なんです。
だから、アプリを作る側が「とりあえずctidをメモしておこう」と保存しておいても、次にアクセスしたときにはもう別のデータになっている……なんて悲劇が起きてしまいます。
—
どんな時に役に立つの?
じゃあ、TIDスキャンは役に立たない技術なのかというと、全くそんなことはありません!
データベースの内部処理や、特定のツールの裏側では大活躍しています。例えば、こんな場面です。
- 「とりあえず今見つけたこの行を、もう一回確認したい!」:検索結果のリストから特定の行を再取得する際、PostgreSQLは内部的にこのTIDを使っています。
- 特定のデータの修正・削除:一度検索して場所を特定した直後に、その場所(ctid)を直接指定して「この行を書き換えて!」と指示を出すことで、無駄な検索時間を省いています。
—
まとめ:魔法の近道との付き合い方
TIDスキャンは、PostgreSQLという図書館の司書さんが持っている「裏口への鍵」みたいなものです。
- 究極に速い:場所を直接指定するので、迷いようがないから。
- でも不安定:データが引っ越すと番号が変わってしまうから。
僕たちエンジニアが普段のクエリで「よし、ctidを直接指定して高速化しよう!」と意気込む必要はほとんどありません。むしろ、PostgreSQLが裏側でこの魔法を使って、僕たちのリクエストを全力で高速化してくれていることに感謝しましょう。
「データベースの裏側では、こんな風に最短距離を走る工夫がされているんだな」とイメージできるだけで、皆さんのデータベースに対する理解はグッと深まるはずですよ。
それでは、また次回のブログでお会いしましょう!Happy Coding!
コメント