NOBTAの気ままにITブログ

Azure全般 / SQL Serverに関する情報を発信していきます。


スポンサーリンク

【第2回】基本から始める Azure Database for PostgreSQL 【PostgreSQL (オンプレミス)(2)】


スポンサーリンク

前回、【第1回】基本から始める Azure Database for PostgreSQL 【PostgreSQL (オンプレミス)(1)】で、PostgreSQLのアーキテクチャについてまとめてみました。

今回は、その続きについて、自分の整理も兼ねて、まとめてみようと思います。

※ PostgreSQL (オンプレミス) は、Azure Database for PostgreSQLで選択可能なバージョン「11」を使用しています。

 

PostgreSQL (オンプレミス) について

■ PostgreSQL の アーキテクチャ (2)

◇ PostgreSQLのファイルシステム
  • initdb コマンドを実行することでディスク上に各種データ格納領域を用意し、データファイル、WAL (トランザクションログ)、設定ファイルが作成される。
  • initdb コマンドで作成される単位は「データベース クラスタ」と呼ばれる。
  • データベース クラスタには 複数のデータベースが含まれる。
  • データベース クラスタとインスタンスは 1:1 の関係となっている。

  データベース クラスタ (ファイルの構造)

 data
  ├──base (実データの格納領域
  │    ├──1
  │    └──16393
  ├ ・・・
  ├──log (ログ情報の格納領域)
  │    └──postgresql-2020-07-28_173940.log
  ├──pg_wal (トランザクションログの格納領域)
  ├ ・・・
  └──postgresql.conf (設定ファイル)

 f:id:nobtak:20200728200221p:plain

[補足] 

・SQL Server では、データベース物理ファイル (.mdf/.ndf) の中にすべてのオブジェクト(テーブルなど) が含まれるが、PostgreSQLでは、テーブル毎にデータファイルが作成される。

・データページのサイズは、SQL Server と同じく 8KB。

・SQL Serverと同様に、1インスタンス (データベース クラスタ) に複数のデータベースを保持する。

 

◇ PostgreSQLのメモリシステム 

f:id:nobtak:20200728202145p:plain

■ グローバル メモリ
PostgreSQLの全プロセスが共有するメモリ

・PostgreSQL (マスタプロセス) により確保/解放される。

・OSの共有メモリ空間内に確保される。

・PostgreSQLの全プロセスで共有するデータ (テーブルデータなど) がキャッシュされる。

■ 各プロセス単位で確保するメモリ

・各プロセスの生成/終了のタイミングで確保/解放される。

・個々の処理 (ソート処理など) などに使用される。 

 f:id:nobtak:20200728212038p:plain

[補足] 

SQL Server では、ソート処理、ハッシュ結合処理がメモリの範囲内で行えない場合、代わりに tempdb が使用されることになる。

 

◇ PostgreSQLのチェックポイント 

共有バッファ上の変更されたデータについては、データの更新とは非同期にある程度の間隔でディスクへの書き込みを実施する。この処理のことを チェックポイント と呼ばれている。

チェックポイントは、特定の間隔、WALファイルの量によって自動的に実施される。

 

■ チェックポイントに関連するパラメータ

f:id:nobtak:20200728232957p:plain

 設定ファイルのパラメータの内容については、以下の URL を参照。

postgresqlco.nf

 

◇ その他 アーキテクチャ

WAL

WAL (Write Ahead Log) は、SQL Server で言えば トランザクション ログと類似のアーキテクチャであり、クラッシュ時、最後のチェックポイント以降に蓄積されたWALからリカバリ処理を実施するために使用される。

 

追記型アーキテクチャ 

更新/削除時、変更前のタプル(行)を残したまま、新規に変更後のタプルを追加するというアーキテクチャ。

※ SQL Server/Oracle は「更新型アーキテクチャ」で変更対象のデータに対してロックを獲得し、更新するアーキテクチャ 

 

◆メリット

  • 更新時にロックを必要としないため、ロック競合(ブロッキング)が発生しにくい。
  • 更新前、削除対象のタプルが残っているため、ロールバック処理が容易。
  • UNDOセグメント管理が不要 

◆デメリット 

  • 不要となったタプルを削除するため、VACUUM処理を実施する必要がある。

f:id:nobtak:20200729001550p:plain

※ 追加型アーキテクチャの場合、上記の更新クエリを実行した場合、更新後の新しいデータがテーブルに追記され、更新前のデータは不要タプルとしてテーブルに保持される。

 

VACUUM 

更新によって不要となったタプルを回収して、再利⽤可能にする操作。VACUUMにより、テーブルの肥大化を防ぐことが可能。

f:id:nobtak:20200729002041p:plain

※ VACCUM を実行後、不要タプルが解放され、再利用可能な状態になる。更新/削除が頻繁に行われるテーブルに対して VACUUMを実行しなければ、不要なタプルが増加し、テーブルが肥大化する。

 

 [まとめ]

Azure Database for PostgreSQL を理解するうえで、今回も PostgreSQL (オンプレミス) のアーキテクチャをまとめてみました。次回、PostgreSQLのデータベース ロールなどの内容をまとめてみようと思います。

 


スポンサーリンク