【入門編】 FILLFACTOR設定 – PostgreSQL

こんにちは!データベースエンジニアの日常へようこそ。

今日は、PostgreSQLの「知る人ぞ知る隠し味」、FILLFACTOR(フィルファクター)についてお話ししようと思います。

「データベースの性能チューニング」なんて聞くと、なんだか難しそう……と感じるかもしれません。でも大丈夫。このFILLFACTORという概念、実は私たちの身の回りにある「ノート」や「本棚」の話に例えると、ものすごくイメージしやすくなるんです。

—

ギュウギュウ詰めの本棚、どこが問題?

想像してみてください。あなたは、自分の机の横に本棚を置いています。
この本棚は、「1段にちょうど10冊の本が入る」というルールだとしましょう。

効率を重視して、最初の10冊を隙間なくギュウギュウに詰め込んでしまいました。するとどうなるでしょうか?

もし、途中の本の内容を「書き換えたい」とか「新しい情報を書き足したい」と思ったとき、隣に隙間が全くないので、新しいスペースを確保するために、わざわざ別の場所へ本を移動させなきゃいけなくなりますよね。

これ、実はデータベースの世界でも全く同じことが起きているんです。

PostgreSQLの「ページ」という単位

PostgreSQLは、データを「ページ」という箱に入れて管理しています。
デフォルト設定だと、この箱はデータの容量ギリギリまで詰め込もうとします(FILLFACTOR 100%の状態です)。

ところが、データが頻繁に更新されるテーブルだと、箱の中がパンパンだと「更新のための新しい場所」が足りなくて、データベースはあちこち走り回って別の箱を探したり、データの並び順を整理したりと、余計な手間がかかってしまうんです。これが積み重なると、システムの動きが重〜くなっていく原因になります。

解決策:あえて「隙間」を作っておく

そこで登場するのが FILLFACTOR です。
これは、「この箱には、MAXまで詰め込まず、〇%までにしておこうね」とあらかじめ制限を決めておく設定のこと。

例えば、FILLFACTORを「80」に設定すると、箱の20%はあえて空けておくことになります。

  • メリット1:更新がスムーズになる

書き換えが発生しても、隣に空きスペースがあるので、その場でパパッと書き換えが終わります。これをデータベースの世界では「HOT更新」と呼んだりするのですが、とにかく速いんです。

  • メリット2:断片化が防げる

無理やりデータを押し込まない分、箱の中が散らかるのを防げます。結果として、データベースが「整理整頓」のために一生懸命働く時間を減らせるわけです。

でも、欲張りすぎには注意!

「じゃあ、全部FILLFACTORを低く設定して、スカスカにしておけば最強じゃない?」と思うかもしれませんが、そうはいかないのが難しいところ。

  • デメリット:容量を食う

空きスペースをたくさん作れば作るほど、それだけ「箱の数」自体は増えてしまいます。ディスク容量を圧迫しますし、たくさんの箱を読み込まないといけないので、逆に効率が悪くなることもあります。

「読み取り専用のテーブル」ならギュウギュウに詰めてもいいけれど、「しょっちゅう更新されるテーブル」なら少し隙間を作ってあげる。
この「バランス感覚」こそが、データベースエンジニアとしての腕の見せ所なんですよ。

—

今日からできるステップ

もしあなたが今、PostgreSQLを触っていて、「最近、更新が多いテーブルの動きが少しモッサリしてるな?」と感じたら、ぜひFILLFACTORの調整を検討してみてください。

やり方は簡単で、テーブルを作るときや設定変更するときにこう書くだけです。

ALTER TABLE テーブル名 SET (fillfactor = 80);

(※設定を変えた後は、一度テーブルを整理する「VACUUM FULL」や、データの再配置が必要になることもお忘れなく!)

最初は「80〜90%」くらいから様子を見るのが、僕の経験上、一番失敗が少なくておすすめです。

データベースの設計は、まるで自分の部屋の収納を考えるのと同じです。詰め込みすぎず、かといってスカスカにしすぎず。そんな「いい塩梅」を見つけたとき、システムは驚くほど軽やかに動いてくれます。

ぜひ皆さんも、自分の環境で試してみてくださいね。また次回の記事でお会いしましょう!

コメント

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