BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Postgre SQL】キャッシュの利用による性能向上

初めに

こんにちは。株式会社BFT名古屋支店のないとうです。
今回はキャッシュを使った性能向上について書いていこうと思います。

キャッシュとは

キャッシュとはバッファに一度利用したデータを保存することで再度データを利用した場合の処理速度を向上させる仕組みです。
またバッファはデータを一時的に保持するメモリー上の領域のことを指します。

キャッシュの仕組み

SQL文を実行した際に検索したテーブルのレコードをバッファに一時的に記録して次回実行時にバッファに保存したレコードを参照することで、探索時間を短縮します。
キャッシュの記録方法としてはバッファ内で複数ページが準備されており、そこに保存するようになっています。
またキャッシュを保存するメモリがいっぱいになると古いものから順に消すようになります。

f:id:bftnagoya:20220308164841p:plain
キャッシュのイメージ図

キャッシュの効果

通常のHDDに保存されているデータはアクセスするのに10ミリ秒ほどかかります。
SSDであっても50マイクロ秒ほどかかります。
対してキャッシュに使われるバッファのひとつであるL3キャッシュは50ナノ秒ほどでアクセスができます。
これによりアクセス速度が1/1000程度になります。
アクセスの他にも処理があるため実際の処理速度が1/1000になるわけではありませんが、飛躍的に処理速度を向上させることができます。

実際にキャッシュをためるには

先ほど記載した通りキャッシュは一度SQLを実行しなければなりません。
そのためキャッシュの無い最初の1回は2回目以降より処理に時間がかかってしまいます。
しかしながら性能を向上させたいSQLを実行してキャッシュをためるのは、非効率です。
1つのSQL文の中でも処理時間が長い部分と、短い部分があるため全てのキャッシュをためる必要はありません。
また、複数のSQLを同時にキャッシュを用いて性能向上を行いたいときも不要なキャッシュでメモリを埋めてしまうと必要なキャッシュが削除されてしまう可能性があります。
そこで探索に時間がかかっているテーブルのみをキャッシュに乗せることで効率的にSQLの性能向上を行うことができます。
Postgre SQLにはキャッシュを載せるために【pg_prewarm】というモジュールが準備されています。

pg_prewarmの使い方

pg_prewarmはモジュールであるので初めに有効化する必要があります。
有効化は以下のコマンドを用います。

CREATE EXTENSION pg_prewarm;

そしてテーブルにキャッシュを載せるには以下のコマンドを用います。

SELECT pg_prewarm(’テーブル名’);

pg_prewarmのオプション

pg_prewarmには前述したように第一引数でテーブル名を指定する他にオプションが設定できます。

オプションの引数 内容
第2引数 使用方法の指定
第3引数 載せるデータの指定
第4引数 始点ページ番号
第5引数 終点ページ番号

第2引数では'buffer','read','prefetch'の3種類のオプションがあり、それぞれ以下のように動作します。
'buffer'はPostgre SQLのバッファに載せる
'read'はOSのバッファに載せる
'prefetch'はOSにプレフェッチを要求する
第3引数では'main' 'fsm' 'vm'の3種類のオプションがあり、それぞれ以下のように動作します。
'main'はテーブルのデータ本体を載せる
'fsm' 'vm'はデータの管理領域の情報を載せる
第4,5引数でキャッシュを載せるページを指定できます。

まとめ

キャッシュはバッファと呼ばれる高速にアクセスできる記憶領域にデータをためることで飛躍的に処理速度を向上させることができます。
ただしキャッシュはバッファが満たされると削除されてしまうためバッファの大きさによってキャッシュに載せるテーブルを選択する必要があります。
そのため効率的にキャッシュをためる方法としてPostgre SQLのモジュールである【pg_prewarm】があります。
このモジュールを用いて必要なキャッシュを載せることで処理速度の向上を図ることができます。

最後に

今回はキャッシュについて記載しました。
上手く使うことができればSQLの性能を向上させられるため、より理解を深めるために調査・学習を続けていきたいと思います。
それでは。