ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

PostgreSQLのデータベースクラスタ及びテーブルスペースの関係

はじめに

PostgreSQLの「データベースクラスタ」及び「テーブルスペース(テーブル空間)」の関係を説明します。

前提

このエントリではPostgreSQL 9.6のドキュメントをベースに解説します。

データベースクラスタ

PostgreSQLにおける「データベースクラスタ」とは1つのサーバインスタンスで管理するデータベースの集合体のことです。

ファイルシステムの観点からデータベースクラスタを見ると、『すべてのデータが格納される1つのディレクトリ』です。以下の記事の<図4:PostgreSQLファイル構成>がイメージしやすいです。
PostgreSQLアーキテクチャと性能の勘所

データベースクラスタ作成直後には3つのデータベース(posgres, template0, template1)が含まれています。

テーブルスペース(テーブル空間)

テーブルスペースはデータベースオブジェクト(データベース、テーブル、インデックス、シーケンス)の格納領域です。テーブルスペースを日本語版PostgreSQLマニュアルでは「テーブル空間」と表記しています。

デフォルトで用いられる格納領域のことを「デフォルトテーブルスペース」と呼びます。デフォルトテーブルスペースにはデータベースオブジェクトだけでなく、PostgreSQLの管理情報等(例えばトランザクションログ)も格納されます。

PostgreSQLのドキュメントではテーブルスペースを利用するメリットとして2つ挙げています。

(1)ディスクレイアウトの自由度が上がる
クラスタを作成したパーティションもしくはボリュームの容量が不足し、拡張を行うことができない場合でも、別パーティションにテーブルスペースを作ることでデータベースオブジェクトの増大に対応できます。

(2)データベースオブジェクトの特性に合わせて格納できる
頻繁にアクセスのあるインデックスを高速なSSDに格納したり、逆にアクセス頻度の低いテーブルを低速・低価格なハードディスクに格納することができます。

データベースクラスタとテーブルスペースの関係

先述の通り、データベースクラスタは『すべてのデータが格納される1つのディレクトリ』です。ですが、テーブルスペースはクラスタを作成したパーティション外にも作成できるとあります。一見矛盾しているこれらの要件ですが、PostgreSQLのドキュメントにヒントがあります。

ユーザが定義したテーブル空間はそれぞれ、PGDATA/pg_tblspcディレクトリ内に物理的なテーブル空間ディレクトリ(つまりそのテーブル空間のCREATE TABLESPACEコマンドで指定された場所)を指し示す、シンボリックリンクを持ちます。

65.1. データベースファイルのレイアウト

"PGDATA"は環境変数で、データベースクラスタディレクトリパスを示します。つまり、テーブルスペースのシンボリックリンクをデータベースクラスタ内に保持することで、『すべてのデータが格納される1つのディレクトリ』を実現しています。

なお、データベースクラスタ初期化時に2つのテーブルスペースが作成されます。

名称 パス 用途
pg_global PGDATA/global 共有システムカタログ用
pg_default PGDATA/base データベースのデフォルトスペース

これらはシンボリックリンクを介することなく、データベースクラスタ内のフォルダに紐付きます。

実例

テーブルスペースを作成・削除することでPGDATA/pg_tblspcディレクトリにシンボリックリンクが作成・削除されることの例を示します。理解を妨げない範囲で省略しています。

$ pg_ctl start -D /usr/local/pgsql/data/
$ ls -l /usr/local/pgsql/data/pg_tblspc
合計 0
$ ls -l /usr/local/
drwxr-xr-x. 7 postgres root 68 124 07:57 pgsql
drwxr-xr-x. 2 postgres root 6 39 22:18 pgsql_dbs
$ psql mydb
mydb=# CREATE TABLESPACE dbspace LOCATION '/usr/local/pgsql_dbs';
CREATE TABLESPACE
$ ls -l /usr/local/pgsql/data/pg_tblspc
合計 0
lrwxrwxrwx. 1 postgres postgres 20 39 22:24 16425 -> /usr/local/pgsql_dbs
mydb=# DROP TABLESPACE dbspace;
DROP TABLESPACE
$ ls -l /usr/local/pgsql/data/pg_tblspc
合計 0

「SQLパフォーマンス詳解」(原文タイトル:SQL Performance Explained)の紹介と購入時のポイント

本の紹介

SQLパフォーマンス詳解」(原文タイトル:SQL Performance Explained)はデータベースのBツリーインデックスについて解説しています。インデックスの仕組みから実務に活かせるテクニックまで幅広く取り上げられています。
データベースのインデックスは本やセミナー資料で度々取り上げられる内容ですが、この本はそれらの内容を1冊にまとめ上げています。どこかで見たのだけど…と探して回る前に、この本を紐解けばすぐにみつかるかもしれません。

本はOracleを中心とした構成ですが、補足でMySQLPostgreSQLSQL Serverについても解説しています。著者によれば、Bツリーインデックスは多くのデータベースでほぼ同じように動作すると述べていますし、どのデータベースでも通用する内容となっています。

実はこの本のほぼ全文がオンラインで公開されています。
Use The Index, Luke
データベースのインデックスやパフォーマンスチューニングについて調べているうちに、このサイトへたどり着いた方も多いのではないでしょうか。私もPostgreSQLのインデックスについて調べているうちにたどり着きました。

Webにて無償で公開されているものを購入するのはもったいなく感じるかもしれません。私の場合は著者(@さん)及び翻訳者(@さん)へ恩返ししたいという気持ちからPDF版を購入しました。また、Web版よりPDF版のほうがよみやすく感じました。

まずはオンライン版で内容を確認し、興味を持たれたら購入を検討されてはいかがでしょうか。

日本語版の購入方法

購入サイトはこちらになります。
SQLパフォーマンス詳解
念のためVirusTotalでスキャンしましたが、Clean Siteとの判定でした(2017/03/05時点)。

印刷版とPDF版があります。
印刷版は海外のAmazon(.com/.co.uk/.de)で購入できます。上記サイトから遷移できます。なお、現時点で日本のAmazonからは購入できません。
PDF版は上記サイトから購入できます。2017/03/05時点で9.95ユーロ(約1,300円)でした。

上記サイトからの購入の場合、価格表示はユーロです。支払いはPayPalを利用しています。

PDF版購入の場合、プルダウンでPDFを選択し、「レジへ」ボタンをクリックするとPayPalへ遷移します。PayPalで支払いを済ませると、PayPal登録のメールアドレスへPDF版ダウンロードリンクを含んだメールが届きます。

割引コードの適用

利用可能(2017/03/05時点)な割引コードがありました。PDF版であれば9.95ユーロが5.00ユーロへディスカウントされます。

@さんのブログにコードが記載されています(ここではコードを転記しません)。
SQLのインデックスについて解説した洋書が良かった件。PDF版もあるよ(2012/10/22までの割引購入クーポン有) - Dマイナー志向
ただ、上記エントリによれば本来は2012/10/22で期限が切れるはずだったので、著者が寛大なのか、それとも無効化を忘れているだけかもしれません。
このような背景があるため、購入時点で割引率が変わっていたり、無効になっていたとしてもご了承ください。

割引コードの入力方法を説明します。
「レジへ」ボタンの下にある「割引コードを入力」リンクをクリックします。
割引コードを入力し、「買い戻す」ボタンをクリックします。
すると、表示された価格が当初よりディスカウントされているはずです。コードが無効な場合はエラーとなります。

f:id:pato_taityo:20170305164327p:plain

PayPal支払いでの為替レートと手数料

海外サイトでの購入で気になることの一つに為替レートと手数料があります。
PayPalでは為替レート及び手数料をPayPalとクレジットカード会社から選べます(一部のカードブランドでは選べないようです)。詳細については以下の記事を参照ください。
PayPalの高い日本円の為替手数料(レート)を安く節約する方法

まとめ

SQLのパフォーマンスを上げるためにはインデックスを理解することが重要となります。インデックスにはいくつか種類がありますが、中でもBツリーインデックスは基本といえます。この本(およびサイト)はその基礎知識を学ぶ上でお勧めできます。
今回の本をお勧めするにあたり、本の内容は公開されているため、不安を抱きやすい購入手順を中心にまとめました。ご興味を持たれた方の参考になれば幸いです。

PDCA(Plan, Do, Check, Action)サイクルのActionとは何か?

疑問

PDCA(Plan, Do, Check, Action)サイクルについて、これまで何度も講義やセミナーで説明を受けてきましたが、どうしてもDo(実行)とAction(改善)の違いを理解できませんでした。
また、PDCAは「サイクル」であり、P→D→C→A→P→…のように繰り返すと説明されます。この「改善」の行動をした後に「計画」するということに違和感がありました。

解決

そんな悩みに対し、こう考えてはどうかとアドバイスがありました。
P : 計画
D : 実行
C : 評価(計画と実績の差異確認)
A : 改善(差異に対して行うアクションの決定)

改善(A)フェーズで計画と実績の差異の是正のために行うアクション(行動)を決定します。そして、決定したアクションを次の計画(P)フェーズで計画に組み込み、実行(D)フェーズで行動します。確かにこれであればA→Pへのつながりも自然なものとなります。

また、WEB+DB PRESS(プログラミング技術情報誌)の記事でPDCAの"A"は「Action(行動)」ではなく「Adjust(調整)」だと解説していた、というエントリもありました。
PDCAの「A」がActionじゃなくてAdjustって聞いてめっちゃしっくりきた話 - SUKEMATSU.NET
こちらのほうがしっくりくる方もいるかもしれません。

最後に

PDCAサイクルは行動することが最も大切です。そして、PDCAサイクルの定義について腹落ちしていれば、行動したときの納得感が変わってきます。今回のエントリがその一助となれば幸いです。