こんにちは!データベースエンジニアの日常へようこそ。
今日は、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%」くらいから様子を見るのが、僕の経験上、一番失敗が少なくておすすめです。
データベースの設計は、まるで自分の部屋の収納を考えるのと同じです。詰め込みすぎず、かといってスカスカにしすぎず。そんな「いい塩梅」を見つけたとき、システムは驚くほど軽やかに動いてくれます。
ぜひ皆さんも、自分の環境で試してみてくださいね。また次回の記事でお会いしましょう!
コメント