【入門編】 コストパラメータのチューニング – PostgreSQL

データベースの「移動ルート」を最適化しよう!PostgreSQLのコスト調整、はじめの一歩

こんにちは!データベースエンジニアの日常を綴っているブログへようこそ。

皆さんは、PostgreSQLを使っていて「どうしてこのクエリ、こんなに時間がかかるんだろう?」と悩んだことはありませんか?実は、データベースの世界には「カーナビ」のような仕組みがあって、目的地(データ)にたどり着くまでのルートを自分で計算しているんです。

今日は、そのカーナビが「どの道を選ぶか」を決定づける重要な設定値について、少しだけ掘り下げてみたいと思います。専門用語ばかりで難しそうに聞こえるかもしれませんが、日常の「移動」に例えてみると、驚くほどシンプルですよ。

—

データベースの「カーナビ」が考えていること

PostgreSQLはクエリを実行するとき、「このデータを取り出すには、どの手順が一番速いかな?」と事前に計算します。これを「実行計画」と呼びます。

このとき、データベースは頭の中でこんなふうに考えています。

  • 「本棚を端から端まで全部見る(シーケンシャルスキャン)?」
  • 「目次(インデックス)を使って、必要なページだけピンポイントで開く(インデックススキャン)?」

ここで基準になるのが、「どれくらいコストがかかるか」という数値です。このコストを決めているのが、今回紹介するパラメータたちなんです。

1. `seq_page_cost`:本を全ページめくるコスト

これは「本を最初から最後までパラパラと全部めくる作業」にかかる手間です。
基本的には「1」という値が設定されています。全部見るのは時間がかかるので、コストはそれなりに高く見積もられます。

2. `random_page_cost`:あちこちのページをめくるコスト

これは「インデックスを使って、必要な箇所を飛び飛びに開く作業」にかかる手間です。
デフォルトでは「4」になっています。「ページをめくって、また別のページをめくって…」と繰り返すのは、一気に読むよりも疲れますよね?だから、データベースはこれを「ちょっと割高な移動」だと認識しているんです。

3. `cpu_tuple_cost`:中身をチェックするコスト

これは「開いたページに書かれている内容が、探しているものかどうかを確認する」作業です。これは移動コストに比べると非常に小さい値(0.01など)です。

—

ハードウェアに合わせて「カーナビの設定」を更新しよう

ここからが面白いところです。皆さんが使っているストレージ(保存場所)がHDDか、それとも現代的なSSDかによって、この「コスト感」はガラリと変わるべきなんです。

HDDを使っている場合

HDDは物理的に円盤が回る仕組みなので、読み取りヘッドが「あちこちに飛ぶ(ランダムアクセス)」のが大の苦手です。だからこそ、`random_page_cost`は高めに設定しておかないと、データベースは「インデックスを使えばいいのに、わざわざ全件検索を選んでしまう」なんていう判断ミスを犯すことがあります。

SSDを使っている場合

SSDはどこにアクセスしても速いので、HDDのような「あちこち飛ぶと時間がかかる」というペナルティがほとんどありません。
つまり、`random_page_cost`をデフォルトの「4」から「1」や「1.1」に下げてあげることで、データベースは「インデックスを積極的に使ってもいいんだ!」と気づき、もっと効率的なルートを提案してくれるようになるんです。

—

チューニングのコツ:いきなり変えないで!

「じゃあ、すぐに数値を書き換えよう!」と思ったあなた。ちょっと待ってくださいね。

データベースのチューニングは、お料理の塩加減に似ています。いきなり大量に振るのではなく、少しずつ調整して、味(実行計画)の変化を確認するのが鉄則です。

1. まずは現状を知る:`EXPLAIN ANALYZE`コマンドを使って、今のクエリがどんなルートを通っているか見てみましょう。
2. 少しだけ変える:例えばSSDなら、まずは `random_page_cost` を「2」くらいに下げてみて、実行計画が変わるか確認してみてください。
3. 様子を見る:劇的な変化がないこともあります。それはそれで「データベースが今のルートが最適だと判断している」という証拠です。

—

最後に

データベースの設定値は、ただの数字の羅列ではありません。それは、私たちが使っているサーバーの「身体的特徴」をデータベースに教えてあげるためのメッセージです。

「うちはSSDだから、もっと素早く動いていいんだよ!」
そう伝えてあげるだけで、データベースは驚くほど軽快に動いてくれるようになります。

難しく考えすぎず、ぜひ皆さんの環境でも試してみてくださいね。もし「こんな値にしてみたよ!」という体験談があれば、ぜひコメントで教えてください。それでは、楽しいデータベースライフを!

コメント

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