【入門編】 HOT更新 (Heap Only Tuple) – PostgreSQL

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

普段、PostgreSQLを使っていると「なんだか最近、動きが重たい気がするなぁ」と感じることはありませんか?実はそれ、データベースが裏で「お片付け」に追われているせいかもしれません。

今日は、そんなデータベースの知られざる努力……というか、賢いショートカット術である「HOT更新(Heap Only Tuple)」についてお話しします。

専門用語を並べるのは一旦お休みして、ちょっとした「図書館」の例えで考えてみましょう。

—

本の場所を書き換える「大変な作業」

想像してみてください。あなたは巨大な図書館の管理人です。
利用者が「この本の内容をちょっと書き換えたい」と言ってきたとき、あなたはどうしますか?

1. 本の内容を書き換える(ページを修正)。
2. 「この本は〇〇棚の何番目にある」という索引カードを、新しい場所に書き直す。

実は、PostgreSQLも普通はこの「2番」をやっています。でも、もし本の場所(ページ番号)が変わっていないのに、わざわざ索引カードを書き換えるのって、すごく無駄だと思いませんか?

「中身は変わったけど、置いている場所は同じなんだから、索引カードはそのままでいいじゃん!」

これがHOT更新の考え方なんです。

なぜ「HOT」が大切なの?

もし、中身を直すたびに索引カード(インデックス)まで書き直していたら、どうなるでしょう。

  • 手間が増える: 修正のたびに棚まで走って、カードを書き換えて……と、作業量が増えますよね。
  • カードが溢れる: 「修正前」のカードと「修正後」のカードがどんどん増えて、索引の箱がパンパンになってしまいます。

これがデータベースの世界では「インデックスの肥大化」という現象です。インデックスが巨大になると、目的の本を探すのに時間がかかってしまい、結果として「データベースが遅い!」という悲劇が生まれるわけです。

HOT更新を成功させる「たった一つのルール」

この魔法のようなHOT更新をデータベースに行わせるには、実は私たち人間が気をつけてあげないといけないルールが一つだけあります。

「検索に使っている情報(インデックスの列)は、できるだけ書き換えない」

これだけです。

例えば、「会員番号」や「登録日時」のように、一度決めたら変わらないものを検索条件にするのはOK。でも、頻繁に変わる「現在のポイント数」や「最終ログイン時刻」といった項目をインデックスに含めてしまうと、PostgreSQLは「あ、これインデックスも書き直さなきゃ!」と判断して、HOT更新を諦めてしまうんです。

ちょっとしたコツ

  • 更新頻度が高い項目には、インデックスを貼るのを慎重にする。
  • テーブルの設定で「Fillfactor(詰め込み率)」を少しだけ余裕持たせてあげる。(これは「棚に少し隙間を作っておく」ようなイメージです。これがあると、HOT更新が成功しやすくなりますよ!)

—

まとめ:データベースと仲良くするために

HOT更新は、データベースが自ら「効率よく動こう!」としてくれる素晴らしい機能です。でも、私たちが「あちこちの項目にインデックスを貼りまくる」ような無茶な設計をしてしまうと、その能力を発揮できなくなってしまいます。

「この項目はよく変わるかな?」「ここは検索で一番使う場所かな?」

そんなふうに、データベースの気持ち(?)になって設計を考えてみると、あなたの作ったシステムはきっと、驚くほど軽やかに動いてくれるはずです。

データベースのチューニングって、なんだか料理の隠し味や、整理整頓のコツと似ていると思いませんか?ぜひ皆さんの開発現場でも、この「HOT更新」を意識したモデリングに挑戦してみてくださいね!

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

コメント

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