こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを触っていると「SQLを書いてデータを検索する」というのが当たり前の風景ですよね。でも、もし「このデータの場所(住所)を直接知っていたら、もっと早くたどり着けるんじゃない?」と考えたことはありませんか?
今日は、そんな「裏技」みたいな検索方法、TIDスキャンについてお話しします。難しそうに聞こえるかもしれませんが、実はとってもシンプルな仕組みなんですよ。
—
本棚に例えて考えてみよう
想像してみてください。あなたは巨大な図書館の司書さんです。
お客さんから「『銀河鉄道の夜』を貸して」と言われたら、どうしますか?
通常なら、カタログ(インデックス)を引いて、著者名やタイトルから本の場所を探しますよね。これがデータベースでいう「インデックススキャン」です。
でも、もしあなたが「その本は、第3書庫の、上から5段目の、左から2番目にあるよ」という正確な「座標」をすでに知っていたらどうでしょう?
カタログを引く手間なんてゼロですよね。そのまま一直線にその場所へ向かって、サッと本を抜き取るはずです。
この「座標を直接指定して取りに行く」というのが、TIDスキャンの正体なんです。
—
TID(Tuple Identifier)って何?
専門的な話を少しだけ噛み砕くと、TIDというのは「物理的な住所」のことです。
PostgreSQLの中では、すべてのデータ(タプル)に対して「どのページの、何番目の位置にあるか」というIDが割り振られています。
- ページ番号:本棚のどの「階」にあるか
- タプルインデックス:その階のどの「場所」にあるか
この2つを組み合わせたものがTIDです。データベース内部の住所録のようなものですね。
—
TIDスキャンが最強な理由
TIDスキャンは、PostgreSQLが使える検索手法の中で「最速」と言っても過言ではありません。
だって、考えてもみてください。
インデックスを辿る必要もなければ、テーブル全体をなめる必要(フルスキャン)もありません。「ここにある!」と分かっている場所に直接手を伸ばすだけですから、無駄な動きが一切ないんです。
でも、普段はあまり使わないよね?
そうなんです。ここが面白いところで、実はTIDスキャンは、人間が直接SQLで指定して使う機会はそう多くありません。
なぜなら、データベースというのは本来「名前」や「ID」など、人間にとって意味のある情報でデータを検索したいものだからです。「物理的な住所」なんて、データが更新されたり整理(バキューム処理)されたりすると、コロコロ変わってしまうこともありますよね。
「昨日までそこにあった本が、今日は別の場所に移動している」……そんな図書館では、住所を覚えておくのは大変です。
—
どんなときに活躍するの?
じゃあ、この機能は無駄なのかというと、全くそんなことはありません。むしろPostgreSQLの縁の下の力持ちなんです。
例えば、「一度検索したデータの詳細を、もう一度素早く見たい」といった内部的な処理や、特定のツールがデータの場所を特定して修正を行う際など、システムが裏側で「ここだよ!」とピンポイントで指定する時に、TIDスキャンは最高のパフォーマンスを発揮してくれます。
—
まとめ:仕組みを知ると、データベースはもっと面白くなる
TIDスキャンについて、少しイメージが湧きましたでしょうか?
1. TIDはデータの「正確な住所」
2. インデックスすら使わない「最短ルート」の検索
3. 普段は裏方だけど、ここぞという時に爆速で仕事をしてくれる
データベースの世界は、一見すると無機質な数字の羅列ですが、中身を知ると「こうやって効率よく動いているんだ!」という職人芸のような工夫がたくさん隠されています。
もし次に、ものすごく重いクエリに悩まされたら、「あ、このデータ、物理的な場所まで一直線にいけたらどんなに楽だろうな」なんて、TIDスキャンのことを思い出してみてください。きっと、データベースを見る目が少し変わるはずですよ。
それでは、また次回の記事でお会いしましょう!Happy Querying!
コメント