PostgreSQLの「隠し味」? `seq_page_cost` を調整してデータベースを賢くする方法
みなさん、こんにちは!データベースエンジニアの現場で日々SQLと格闘している筆者です。
PostgreSQLを使っていると、最初はサクサク動いていたはずのクエリが、データが増えるにつれて「あれ、なんか最近動きが重くない?」なんて感じること、ありますよね。
今日は、そんな時にちょっとした「魔法のスパイス」のように効いてくる、`seq_page_cost` という設定についてお話ししようと思います。難しい言葉は極力避けて、身近な例えで解説していきますね。
—
「本棚から本を探す」ことに例えてみよう
想像してみてください。あなたは巨大な図書館の司書さんです。膨大な数の本の中から、特定の情報が書かれたページを探し出す仕事をしているとします。
このとき、探し方は大きく分けて2つあります。
1. シーケンシャルスキャン(全ページめくり)
棚にある本を最初から順番に、端から端まで全部めくって探す方法です。確実ですが、めちゃくちゃ時間がかかりますよね。
2. インデックススキャン(索引を使う)
巻末の索引(インデックス)を見て、「この情報はこのページのあたりにあるな!」と目星をつけて、ピンポイントでそのページを開く方法です。圧倒的に早いです。
PostgreSQLもこれと同じことをやっています。`seq_page_cost` というのは、「全ページめくり(シーケンシャルスキャン)をする時に、どれくらいのコスト(手間)がかかるか」を決める値なんです。
—
なぜこの値を調整する必要があるの?
PostgreSQLは非常に賢いので、基本的には「どうやって探すのが一番早いかな?」と自分で計算してくれます。
でも、最近のコンピュータのハードウェアは進化がすごいです。特に、SSDのように「端から端までパッと読み込むのがめちゃくちゃ速い」ストレージを使っている場合、PostgreSQLが本来の計算よりも「全ページめくりはすごく時間がかかるから、索引を使ったほうがいいよ!」と過剰に慎重になってしまうことがあるんです。
結果として、「いやいや、SSDなら全部めくっちゃったほうが実は速いんだけどな…」というミスマッチが起きることがあります。
そこで、この `seq_page_cost` を調整してあげるわけです。
—
どうやって調整するの?
デフォルトでは、この値は「1.0」になっています。「全ページめくりにはコストが1かかるよ」という基準ですね。
もし、お使いの環境(クラウドの高速なSSDなど)で「全ページめくりが意外と速いな」と感じたら、この値を少し下げてみます。
- 値を小さくする(例:1.0 → 0.5など):
「全ページめくりのコストはそんなに高くないよ!」と教えてあげることになります。すると、PostgreSQLは「じゃあ、全部めくって探そうかな」と判断しやすくなります。
- 値を大きくする:
逆に、古いHDDなどで「全ページめくりは本当に遅いからやめておこう」と思わせたい時は、値を大きくします。
—
注意点:いきなりいじらないで!
ここまで読んで「よし、さっそく設定を変えて速くしよう!」と思った方、ちょっと待ってくださいね。
データベースの設定変更は、いわば「料理の隠し味」です。入れすぎると料理全体のバランスが崩れてしまうように、この値をむやみにいじると、かえって他のクエリが遅くなってしまうこともあります。
まずは以下の手順で進めるのが、ベテランの知恵です。
1. 今の動きを確認する: `EXPLAIN` コマンドを使って、そのクエリが今どうやって動いているのかを確認しましょう。
2. テスト環境で試す: 本番環境でいきなりやるのは厳禁です!必ず複製した環境で試してみてください。
3. 少しずつ変える: 0.1単位で調整して、変化を見守るのがコツです。
—
まとめ
`seq_page_cost` を調整することは、データベースに「この環境だと、こういう探し方が一番お得だよ」と教えてあげる作業です。
「難しそう…」と身構える必要はありません。最初は「そういう設定があるんだな」と知っておくだけでも、いつか必ずあなたのデータベース運用を助けてくれるはずです。
もし「最近クエリが遅いな」と悩んでいたら、ぜひ一度、この隠し味のことを思い出してみてくださいね。それでは、また次回の記事でお会いしましょう!
コメント