天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます(たまに関係ない雑記も)

最強DB講義 #16 PostgreSQL アーキテクチャの概要 (長田悠吾氏)のアーカイブを見た

dblectures.connpass.com

こちらのイベントのアーカイブを見たので、会の様子と感想を書いていこうと思います。

会の概要

ファイル編成、問い合わせ処理、トランザクションなど、データベースシステムの理論面については多くの教科書で解説されています。本講演ではこれらの一般論を背景に、その具体的な実装例として現実世界でに広く使用されているオープンソースデータベースである PostgreSQLアーキテクチャについて概説します。

会の様子

プロセス構造

Postgreのプロセス構造についてまず説明がありました。Postgreはマルチプロセスであり*1、Postgreの管理プロセスでありクライアントから接続要求を受け取るpostmaster、クライアントと問合せのやりとりをするPostgresエンジン、postmasterの常駐プロセス群(メモリ上のデータを書き出すbackground writer、トランザクションログをディスクに書き出すWAL writer、checkpointを実行するcheckpointer、バキュームを実行する自動vacume起動プロセス)などの紹介がありました。

データベースクラスタ

Postgreは1インスタンスで複数のDBを管理しており、個々のDBに複数のテーブルやインデックスが定義されているということです。このような仕組みをデータベースクラスタと読んでいるということです。

ファイル編成

次にファイル編成*2の話がありました。

具体的なファイル編成の方法としては以下があるということですが、Postgreは全てヒープ編成ファイルになっているということでした。(1つのテーブルは1GB単位になるようにファイル分割され、ファイル内は8KBのブロックに分割されており、ブロックはページヘッダとアイテムポインタから構成されている)

  • ヒープ編成ファイル(順次レコードを格納)
  • 順次編成ファイル(キーの値順に格納)
  • 直接編成ファイル(キーのハッシュ値をもとに格納)
  • 索引構造を内部に含む編成

インデックス

Postgreのインデックスはテーブルのデータとは別のファイルに格納されているということで、多数の種類のインデックスがサポートされているというお話でした。(デフォルトのB-Treeインデックス、HashやGINなど。自作のインデックスも使用可能)

インデックスファイルはヒープファイルと同じファイル編成をしているということです。

問い合わせ処理

Postgreでは、問い合わせを受信後にまずパーサが構文解析をした後、アナライズ処理で意味解析をして、問い合わせツリーがリライト処理で書き換えられ、問い合わせ最適化をするプラン処理でできるだけコストの小さい実行計画を生成し、最後にエグゼキュート処理をエグゼキューターが実行するということです。

パス探索

パス探索では、シーケンシャルアクセス、インデックスアクセスといったテーブル探索やマージ結合、ハッシュ結合などといったあらゆるテーブル探索・結合方法を模索するということです。
ここでコスト見積もりをするのですが、この際は行数やページ数等から推定するということでした。

統計情報

Postgreの標準的な統計情報はアナライズコマンドで実行されますが、*3検索で複数列が使われている場合など、条件によっては統計情報が正しく分析できないということで、拡張統計が用意されているということでした。

トランザクションの同時実行制御

同時実行制御をの実装方法が紹介されていきました。
Postgreはでは、MVCC(多数同時実行制御)を採用しているということで、「読み」と「書き」がお互いに干渉しないように、同じデータの過去状態を現在とは別バージョンとして保存しておくということです。

障害回復

Postgreでは物理論理ロギング(変更のあったページを物理的に指定)を採用しており、即時更新で障害回復を実施するということです。
ただし、Postgreでは追記型のMVCCをとっているため、undo処理がいらないような仕組みになっているようです。

チェックポイント

Postgreではチェックポイント中にトランザクションがブロックされることはなく、チェックポイント開始時にログの位置をREDOポイントとして記録しておき、障害回復時にはここからログの適用を開始するということです。

会全体を通した感想

前回初めて本イベント(本学会)の存在を知ったのですが、名前に最強とある通り、めちゃくちゃ面白いイベントでした。
久々に新たな楽しい会を知ることができて嬉しかったです。

説明もわかりやすくて、そこまでPostgreはに詳しくない自分にも優しい内容でした。

*1:MySQLはマルチスレッドだがPostgreはスレッドが動いていない

*2:ファイルを用いてリレーションを実装する際に、レコードをページに割り当てる方法

*3:手動実行する場合と、必要に応じて行われる自動実行の2パターンがある